Tag: 承诺

Nodejs与promise保持并行

我有这样的字典: {go: ['went', 'run'], love: ['passion', 'like']} 一个键的价值是它的同义词。 而'getSynonymWords(word)'是一个asynchronous函数,它返回一个promise,其值是与传递参数相对应的同义词列表。 我怎样才能循环通过对象recursion地获得另一个对象: {went: [], run: [], passion: [], like: []} 这是我的一段代码: function getRelatedWords(dict) { return new Promise(function(resolve) { var newDict = {}; for(var key in dict){ if (dict.hasOwnProperty(key)) { var synonyms = dict[key]; Promise.map(synonyms, function (synonym) { return getSynonymWords(synonym).then(function (synonyms) { newDict[synonym] = synonyms; return newDict; }); […]

蓝鸟 – 如何早日打破承诺链

PromiseA().then(function(dataA){ if (dataA.foo == "skip me") return ?? //break promise early – don't perform next then() else return PromiseB() }).then(function(dataB){ console.log(dataB) }).catch(function (e) { //Optimal solution will not cause this method to be invoked }) 如何修改上面的代码来提前中断(然后跳过第二个())?

如何使用async.js中的Promise进行编码?

背景 我通常会根据async.js编写node.js脚本来控制工作stream程。 有时我发现,基于async.js,代码似乎仍然是一个“地狱”。 如果使用多个嵌套,代码不可读,维护也非常棘手。 我在这里做了一些search,find了一些有用的资源 – 但其中大多数是一般的概念。 所以我会问一个问题。 对于任何反馈,我们都表示感谢。 我的通用代码 var request = require('request'); var async = require('async'); var array = [1, 2, 3, 4 ,5 ,6]; var url = 'http://www.google.com'; async.mapLimit(array, 3, function(number, callback) { request(url + number, function(error, res, body){ //do sth callback(); }); }, function(err){//do nothing}); 题 所以这次我想用Promisereplace这种代码。 能否请你帮忙? 如果问题重复,请提供一些有用的资源url。 谢谢!

用嵌套的承诺编写干净的代码

我正在写一个应用程序,与苹果进行validation以validation接收。 他们有一个沙箱和生产url,你可以张贴到。 在与苹果进行通信时,如果您收到21007状态,则表示您正在发布到制作url,而您应该在发布到沙盒上。 所以我写了一些代码来促进重试逻辑。 这里是我的代码的简化版本: var request = require('request') , Q = require('q') ; var postToService = function(data, url) { var deferred = Q.defer(); var options = { data: data, url: url }; request.post(options, function(err, response, body) { if (err) { deferred.reject(err); } else if (hasErrors(response)) { deferred.reject(response); } else { deferred.resolve(body); } }); return […]

在forEach循环中保证

在一个Node应用程序中,我需要以同步的方式迭代一些项目,但循环内的一些操作是asynchronous的。 我的代码现在看起来像这样: someAPIpromise().then((items) => { items.forEach((item) => { Promise.all[myPromiseA(item), myPromiseB(item)]).then(() => { doSomethingSynchronouslyThatTakesAWhile(); }); } } 当这个items是1的数组的时候,这会有奇效。但是,一旦有多个项目, promise.all()就会立刻为数组中的每个项目开始,而不用等待循环中的操作结束。 所有这一切…如何确保数组中的每个项目的整个操作同步运行(即使某些操作是asynchronous并返回一个承诺)? 非常感谢! ñ

Node.js承诺与mongoskin

我试图避免在进行mongodb查询时使用callback。 我使用mongoskin来打电话,如下所示: req.db.collection('users').find().toArray(function (err, doc) { res.json(doc); }); 在许多情况下,我需要做多个查询,所以我想使用Node.js承诺库,但我不知道如何将这些函数作为承诺包装。 我看到的大多数例子对于像readFile这样的事情来说都是微不足道的,我猜在这种情况下,我需要以某种方式包装到Array中。 这可以做,或将不得不由蒙古人实施的东西? 一个例子可以是任何一组callback,find / insert,find / find / insert,find / update: req.db.collection('users').find().toArray(function (err, doc) { if (doc) { req.db.collection('users').find().toArray(function (err, doc) { // etc… }); } else { // err } });

nodejs等待,直到所有的MongoDB调用循环完成

我正在逐行读取一个CSV文件的数据stream,并在每一行调用一个findOne MongoDB调用,在运行下一个函数之前,我怎么才能等到每行的所有mongo调用都完成? 我见过Promises能做到吗? 但是我发现Promises非常难以理解。 而且我发现的例子都没有包括我想要的。 :/ var validProducts = []; fs.createReadStream(req.file.path) .pipe(csvStream) .on('error', function (err) { console.error(err); }) // loop through all rows .on('data', function (data) { if (data.size === 'a3') { ProductModel.findOne({ sku: data.sku }, function (err, product) { if (product !== null) { product.size = data.size; product.save(); validProducts.push(product); } }); } }); // […]

承诺Js:等待承诺履行

我正在与Bluebird在Node.Js中做出承诺,并想知道如何在履行承诺(完成)时作出函数返回。我想要的行为是: function getItem(){ functionReturningPromise.then(function(result){ //do some operation on result return result; }); } 但是,上述实现不会返回任何东西,因为承诺在执行时没有完成。 什么是最好的解决方法呢? getItem的目的是修改任何functionReturningPromise返回,然后返回它

如何使用请求库和Bluebird发送发布请求?

所以inheritance人我的设置: var Promise = require("bluebird"); var request = Promise.promisify(require('request')); 这工作: request('url') 它返回一个承诺 这不: request.post('url', {form: {type: 'artist'}}) 给我这个错误: TypeError: Object function promisified(_arg0,_arg1) { … }has no method 'post' at /Users/beamer30/projects/wevo/controllers/music.js:85:30 at Array.map (native) at MusicSearch.spotifyRelated (/Users/beamer30/projects/wevo/controllers/music.js:84:22) at MusicSearch.findRelatedArtists (/Users/beamer30/projects/wevo/controllers/music.js:48:7) at musicController.search (/Users/beamer30/projects/wevo/controllers/music.js:100:17) at Layer.handle [as handle_request] (/Users/beamer30/projects/wevo/node_modules/express/lib/router/layer.js:76:5) at next (/Users/beamer30/projects/wevo/node_modules/express/lib/router/route.js:100:13) at Route.dispatch (/Users/beamer30/projects/wevo/node_modules/express/lib/router/route.js:81:3) at Layer.handle […]

如何unit testing一个函数调用另一个返回一个承诺?

我有一个使用快递4的node.js应用程序,这是我的控制器: var service = require('./category.service'); module.exports = { findAll: (request, response) => { service.findAll().then((categories) => { response.status(200).send(categories); }, (error) => { response.status(error.statusCode || 500).json(error); }); } }; 它呼吁我的服务返回一个承诺。 一切正常,但我试图unit testing时遇到了麻烦。 基本上,我想确保根据我的服务返回,我用正确的状态代码和正文刷新响应。 所以摩卡和sinon看起来像这样: it('Should call service to find all the categories', (done) => { // Arrange var expectedCategories = ['foo', 'bar']; var findAllStub = sandbox.stub(service, 'findAll'); […]