Tag: 承诺

将其中一个asynchronous方法重写为使用promise的方法

我怎样才能重写我的callback成承诺,使用asynchronous模块? 例如,如果我有以下代码 async.parallel([ function(){ … }, function(){ … } ], callback); 要么 async.waterfall([ function(callback) { callback(null, 'one', 'two'); }, function(arg1, arg2, callback) { // arg1 now equals 'one' and arg2 now equals 'two' callback(null, 'three'); }, function(arg1, callback) { // arg1 now equals 'three' callback(null, 'done'); } ], function (err, result) { // result now […]

创build并添加到集合,如果不存在sails.js

我对sails.js和node.js 都很陌生 ,所以这可能不是一个Sails的具体问题,但是我创build了一个User和Tag模型,这样User就有很多标签,反之亦然。 用户模型的相关属性是: # models/User.js tags : { collection: 'Tag', via: 'users' }, add_tag: function( name ) { var self = this; Tag.findOne({ name: name }) .then( function( found ){ if( found ) { sails.log.info('found tag ' + found) found.users.add( self.id ); self.save( sails.log.info ); } else { sails.log.info('didnt find tag, creating with ' […]

asynchronousNode.js循环中的variables范围

我想在数组上运行一些数据库查询(使用sails.js),并在查询返回时,做一些事情。 我认为最好的方法是使用for循环,并解决承诺asynchronous,一旦他们都解决了,继续下去。 然而,只有我的数组中的最后一个承诺是解决,它是解决了多次,因为在每个“User.findOne …”然后函数,索引是array.length-1。 我的问题: asynchronous循环中的variables作用域如何工作? 最好的资源来解释这个? 什么是解决我的问题的最好方法? 为什么? 还有其他的模式,我应该使用或不使用? 我对承诺和asynchronousJS相当陌生,所以任何提示都会有帮助! 主要教程我已经检查 https://github.com/kriskowal/q https://github.com/kriskowal/q/wiki/API-Reference https://github.com/bellbind/using-promise-q/ 感谢您的帮助! 我的简化代码: functionWhichReturnsPromise() .then(function(user){ var promises = []; Q.try(function(){ for (var index in array) { var fbid = array[index];// Get fbid from array promises.push(Q.defer().promise); // Add promise to promise array // Find userid from fbid; resolve respective promise when finished […]

如何重用promise?

我正在尝试重用从promise中返回的数据。 但问题是,在第一次调用checkPromise函数后,它立即调用第二个函数,第一个函数的promise没有实现,所以它不会返回任何数据,因此它永远不会进入if子句。 我如何重用诺言? var Promise = require('bluebird'); var request = Promise.promisify(require("request")); var url = 'http://www.google.com'; var obj = new Object; function apiCall(url) { return new Promise(function (resolve, reject) { request(url).spread(function(response, body) { return resolve(body); }).catch(function(err) { console.error(err); return reject(err); }); }); } function checkPromise(url) { if(obj.hasOwnProperty(url)) { var rp = obj[url]; //do something } else […]

具有承诺的nodejs控制器的多个存在点

下面的代码片段是一个nodeJS控制器方法,调用一个返回延期承诺的服务。 我试图理解处理多个存在点的最佳方法。 例如,如果服务返回一个空对象,我希望承诺链存在,并向用户返回“Nothing found here”响应。 如果确实find了,则从步骤1进入承诺链中的下一个项目,即步骤2。 从我的testing,似乎是返回的JSON响应,然后下降到下一个逻辑步骤,即第2步。这个逻辑不能在现在的服务处理,即如果没有项目被发现返回一个错误。 module.exports.show = function (req, res) { service.getItem(itemId) .then(function (item) { if (!item) { return res.json('Nothing found here'); } // Step 1 // do some work on the item return item; }) .then(function (foundItem) { // Step 2 // do some more work on the item return res.json('Item has […]

Node.js承诺和for循环

我设法得到这个,但我再次卡住了。 我的for循环不按我想要的方式工作。 如果有三个angular色,只有最后一个被添加(三次)到我的主轴MySQL表。 (因为它是asynchronous的) 我怎样才能让它“以平行的方式工作,但在添加他/她之后添加一个人的angular色”? 还有其他types的东西我想要做下载图像,所以我正在寻找一种方法来实现“做到这一点,得到这个信息,然后做”。 我正在使用蓝鸟。 如果太明显,我很抱歉,我不明白该怎么做。 var entities = require("entities"); var request = require('request'); var cheerio = require('cheerio'); var person = require('./models').person; var personRole = require('./models').personRole; var personPersonRole = require('./models').personPersonRole; // create promisified version of request() function requestPromise(options) { return new Promise(function (resolve, reject) { request(options, function (err, resp, body) { if (err) […]

Node.js(ES6) – 用Promise.all保证控制stream

我正在尝试创build一个处理并行HTTP请求的队列。 为每个HTTP请求生成一个请求对象,例如 { method: 'POST', uri: 'http://posttestserver.com/post.php', body: { some: 'foo' }, json: true } 我传入这些对象的数组,并希望将它们添加到队列中,然后执行实际的请求。 问题 :Promise.all语句在返回之前等待所有请求完成。 问题 :我希望将所有任务添加到队列中,并在每个请求完成后返回 ,而不是等待它们全部。 任何人都可以build议如何分开逻辑,使请求从任务添加到队列? 注意:promise-queue和request-promise都返回promise。 这是我有: "use strict"; const Queue = require("promise-queue"); const rp = require('request-promise'); const maxConcurrent = 10; const maxQueue = Infinity; const queue = new Queue(maxConcurrent, maxQueue); var options = [ { method: 'POST', […]

承诺加盟变更承诺一切

我读过承诺join被弃用http://bluebirdjs.com/docs/api/promise.join.html 我的问题是 我应该如何改变这个代码来承诺所有 ,如果有更好的方式来编写这个代码(代码工作!),但我想获得您的反馈,但代码应该有相同的逻辑如下 有一个工具来节点与蓝鸟 js可以跟踪我是否有未完成的承诺链 createProc = function (fPath) { "use strict"; return Promise.join( fs.readFileAsync(fPath, 'utf8') .then(function (content) { return parseFile(content).getWeb(); }), scan.findInUseAsync(12, 152, 'localhost') .then(envOptions.mod.bind(null, process.env)) ).then(function (args) { return inter.Process('run', args[0], args[1]); }).then(function (result) { return result.stdout; }, function (error) { return error; }); };

在node.js中的for循环之后完成多个writeFile函数完成时的promise

首先,这是我现在的代码的一部分: return new Promise(function(resolve, reject) { for (var i = 1; i <= variables; i++) { fs.writeFile("file-" + i + ".txt", dataString + ' ' + i + ' 0', "utf-8"); } if (i == variables) resolve('Files have been written'); else reject('Some error occured'); }) 我的问题是,我不知道如何告诉我的承诺,解决所有文件写入writeFile()是asynchronous后。 我想要做的是在我的下一个then()使用这些文件,当他们完全写入我的驱动器。 有人可以帮我吗? 我现在有点迷路,也是node.js的新手,请耐心等待:) 提前致谢! #UPDATE 1: var promises = […]

我怎样才能释放一个资源在一个node QS promise链中并返回一个promise?

新承诺&Q. 我想调用一个抽象底层资源的方法。 该方法将打开资源做一些处理,然后closures资源。 像这样的东西: module.exports = function fetchRecords() { return openConnection() .then(fetchRecords) .then(groupById) .catch(rethrow) .done(closeConnection); } function closeConnection(result) { releaseConnection(); return result; } 由于我打电话完成,回报不是一个承诺,而是一个未定义的。 我希望在我的客户中我可以做到: resource.fetchRecords().then(/*do something else*/); 看起来我必须将底层资源公开给客户端,以便我可以这样做: resource .openConnection() .then(resource.fetchRecords) .then(/*do something else*/) .catch(/*..*/) .end(resource.close) 我不知道Q或诺言…但我想也许有更好的办法? 我应该这样做: module.exports = function fetchRecords() { return openConnection() .then(fetchRecords) .then(groupById) .then(closeConnection) .catch(rethrow); }