定义像Q中的空蓝鸟许诺

用QI可以定义一个新的承诺:

var queue = q(); 

但是,如果我这样做,蓝鸟:

 var queue = new Promise(); 

我得到:

 TypeError: the promise constructor requires a resolver function 

我怎样才能得到和Q一样的结果?

这是我的代码片段:

 var queue = q() promises = []; queue = queue.then(function () { return Main.gitControl.gitAdd(fileObj.filename, updateIndex); }); // Here more promises are added to queue in the same way used above... promises.push(queue); return Promise.all(promises).then(function () { // ... }); 
 var resolver = Promise.defer(); setTimeout(function() { resolver.resolve(something); // Resolve the value }, 5000); return resolver.promise; 

这一行在文档中经常使用。

请注意,这通常是一种反模式。 但是如果你知道你在做什么, Promise.defer()是一种获得类似Q的parsing器的方法。

但是,不鼓励使用这种方法。 蓝鸟甚至不赞成它。

相反,你应该使用这种方式:

 return new Promise(function(resolve, reject) { // Your code }); 

请参阅相关文档位: Promise.defer()和new Promise() 。


在你的问题更新后,这是你的问题:你正在重复使用相同的承诺来解决一些价值。 一个承诺只能解决一次。 这意味着你必须多次使用Promise.defer()

也就是说,看到更多的代码之后,看起来你确实在使用反模式。 使用承诺的一个优点是error handling。 对于你的情况,你只需要下面的代码:

 var gitControl = Promise.promisifyAll(Main.gitControl); var promises = []; promises.push(gitControl.gitAddAsync(fileObj.filename, updateIndex)); return promises; 

这应该足以处理你的用例。 这是更清晰的,它也有正确处理错误的优势。

弗洛里安提供了一个很好的答案为了您原来的问题,有几种方式与蓝鸟开始连锁。

其中一个最简单的方法就是在任何情况下调用Promise.resolve()

 var queue = Promise.resolve(); //resolve a promise with nothing or cast a value 

要么

 Promise.try(function(...){ return ...//chain here }); 

所以你可以这样做:

 var queue = Promise.resolve() promises = []; queue = queue.then(function () { return Main.gitControl.gitAdd(fileObj.filename, updateIndex); }); // Here more promises are added to queue in the same way used above... promises.push(queue); return Promise.all(promises).then(function () { // ... }); 

虽然,我个人会做这样的事情:

 //arr is your array of fileObj and updateIndex Promise.map(arr,function(f){ return Main.gitControl.gitAdd(f.filename,f.updateIndex). then (function(result){ //results here }); 

我碰到这个,因为我有一个方法,在互联网上获取资源并返回内容,但我想要它来处理连接超时,并重试了X之间的延迟时间。

由于Bluebird.defer被弃用,我使用这个技巧:

 const Promise = require('bluebird'); var fetch = function (options, promise) { var resolve, reject; if (promise) { resolve = promise.resolve; reject = promise.reject; promise = promise.promise; } else { promise = new Promise(function () { resolve = arguments[0]; reject = arguments[1]; }); } var retry = {promise: promise, resolve: resolve, reject: reject}; // Your logic here that you want to retry if (typeof options.x === 'undefined') { reject(new Error('X not defined')); } else if (options.x < 3) { options.x++; options.retryAttempt = (options.retryAttempt || 0) + 1; console.log(`Retrying in 1 second attempt ${options.retryAttempt}...`); setTimeout(() => { fetch(options, retry) }, 1000); } else { resolve(options.x); } return promise; } fetch({x:0}) .then(res => { console.log(res); }) .catch(err => { throw err; });