Tag: 承诺

如何正确地放弃使用Q的node.js诺言链?

我为Node.js使用了Q模块 ,试图避免在我有很多步骤的场景中的“厄运金字塔”。 例如: function doTask(task, callback) { Q.ncall(task.step1, task) .then(function(result1){ return Q.ncall(task.step2, task); }) .then(function(result2){ return Q.ncall(task.step3, task); }) .fail(callback).end(); } 基本上这似乎工作; 如果任何一个任务步骤都抛出了错误,那么就会传递给callback函数(尽pipe我很乐意进行改进,因为我是node.js promise的新手)。 但是,当我需要尽早中止任务链时,我遇到了一个问题。 例如,如果result1被成功返回,我可能想要尽早调用callback函数,然后放弃其余的函数,但是我的尝试失败了。 function doTask(task, callback) { Q.ncall(task.step1, task) .then(function(result1){ if(result1) {// the rest of the task chain is unnecessary console.log('aborting!'); callback(null, result1); return null; } return Q.ncall(task.step2, task); }) .then(function(result2){ console.log('doing […]

如何在Q中链接可变数量的promise,依次?

在Q中 ,我已经看到Chaining中的任意数量的承诺 ; 我的问题是不同的。 我怎样才能进行可变数量的调用,每个调用都是asynchronous返回的? 场景是一组HTTP请求,其数量和types由第一个HTTP请求的结果决定。 我想简单地做这个。 我也看到了这样的答案 : var q = require('q'), itemsToProcess = ["one", "two", "three", "four", "five"]; function getDeferredResult(prevResult) { return (function (someResult) { var deferred = q.defer(); // any async function (setTimeout for now will do, $.ajax() later) setTimeout(function () { var nextResult = (someResult || "Initial_Blank_Value ") + ".." + […]

Promise.all()。然后()解决?

使用节点4.x. 当你有一个Promise.all(promises).then()什么是解决数据的正确方法,并传递给下一个.then() ? 我想要做这样的事情: Promise.all(promises).then(function(data){ // Do something with the data here }).then(function(data){ // Do more stuff here }); 但是我不知道如何获取数据到第二个.then() 。 我不能在第一个.then()使用resolve(…) .then() 。 我想我可以做到这一点: return Promise.all(promises).then(function(data){ // Do something with the data here return data; }).then(function(data){ // Do more stuff here }); 但是,这似乎不是正确的方法来做到这一点…什么是正确的方法呢?

节点JS Promise.all和forEach

我有一个像暴露asynchronous方法结构的数组。 asynchronous方法调用返回数组结构,依次公开更多的asynchronous方法。 我正在创build另一个JSON对象来存储从这个结构获得的值,所以我需要注意跟踪callback中的引用。 我已经编写了一个powershell解决scheme,但我想学习一个更习惯或干净的解决scheme。 该模式应该是可重复的n层嵌套。 我需要使用promise.all或一些类似的技巧来确定何时解决封闭的例程。 并不是每个元素都必然会涉及到一个asynchronous调用。 所以在一个嵌套promise.all我不能简单地分配给我的基于索引的JSON数组元素。 不过,我确实需要在嵌套的forEach中使用promise.all之类的东西,以确保在parsing封装程序之前完成所有属性分配。 我正在使用蓝鸟许诺lib,但这不是一个要求 这是一些部分代码 – var jsonItems = []; items.forEach(function(item){ var jsonItem = {}; jsonItem.name = item.name; item.getThings().then(function(things){ // or Promise.all(allItemGetThingCalls, function(things){ things.forEach(function(thing, index){ jsonItems[index].thingName = thing.name; if(thing.type === 'file'){ thing.getFile().then(function(file){ //or promise.all? jsonItems[index].filesize = file.getSize();

与承诺循环

用承诺做一个while循环的习惯用法是什么? 所以: 如果情况仍然存在,请做一些事情再重复一遍,然后做一些其他的事情。 dosomething.then(possilblydomoresomethings).then(finish) 我这样做,我想知道是否有更好的/更多的idomatic方法? var q = require('q'); var index = 1; var useless = function(){ var currentIndex = index; console.log(currentIndex) var deferred = q.defer(); setTimeout(function(){ if(currentIndex > 10) deferred.resolve(false); else deferred.resolve(true); },500); return deferred.promise; } var control = function(cont){ var deferred = q.defer(); if(cont){ index = index + 1; useless().then(control).then(function(){ deferred.resolve(); }); } […]

本地支持Node.js中的承诺

在当前版本的Node.js中是否有对promise的本地支持? Node.js使用V8引擎。 Chrome浏览器也使用这个JavaScript引擎,Chrome 32本身也支持Promise。 但我似乎无法承诺在Node.js中工作(本地)。 我已经尝试了在Chrome 32中的以下代码,它的工作原理。 var promise = new Promise(function(resolve, reject) { // do a thing, possibly async, then… if ( 1===1 /* everything turned out fine */) { resolve("Stuff worked!"); } else { reject(Error("It broke")); } }); promise.then(function( message ) { console.log( message ); }, function( err ) { console.log( err ); […]

用Node.js中的promise来replacecallback

我有一个简单的节点模块连接到一个数据库,并有几个function来接收数据,例如这个function: dbConnection.js: import mysql from 'mysql'; const connection = mysql.createConnection({ host: 'localhost', user: 'user', password: 'password', database: 'db' }); export default { getUsers(callback) { connection.connect(() => { connection.query('SELECT * FROM Users', (err, result) => { if (!err){ callback(result); } }); }); } }; 该模块将从另一个节点模块中被调用: app.js: import dbCon from './dbConnection.js'; dbCon.getUsers(console.log); 我想用promise来代替callback来返回数据。 到目前为止,我已经阅读了以下线程中的嵌套承诺: 使用嵌套承诺编写干净的代码 ,但是我找不到任何对此用例来说足够简单的解决scheme。 使用承诺返回result的正确方法是什么?