Tag: q

如何正确地放弃使用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 ") + ".." + […]

如何等待承诺解决?

我正在处理一个NodeJs框架,要求某个function是同步的,但我需要检索一个只能asynchronous访问的值。 在一个完美的世界里,我可以回报一个承诺,但是我不能。 作为一个快速和肮脏的解决scheme,我创build了以下方法: exports.synchronizePromise = function(promise) { var value; promise.then(function(promiseValue) { value = promiseValue; }); while (!value) {} // Wait for promise to resolve console.log("DONE: " + value); // Never reached return value; }; 但是我得到一个错误。 有什么办法来完成我所需要的?

与承诺循环

用承诺做一个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中的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的正确方法是什么?