我使用Node.js和Bluebird promises库。
此代码完全符合我的要求:
/*
* Try using Bluebird promisify():
* - "Good" case: this works perfectly.
* ... but it DOESN'T use "promisify()"; it creates a new promise for each function.
* - SAMPLE OUTPUT:
* callABC()...
* a(): [ 'a' ]
* b(): [ 'a', 'b' ]
* c(): [ 'a', 'b', 'c' ]
* Done: results: [ 'a', 'b', 'c' ]
*/
var Promise = require('bluebird');
var a = function (results) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
results.push("a");
console.log("a(): ", results);
resolve(results);
}, 15);
});
}
var b = function (results) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
results.push("b");
console.log("b(): ", results);
resolve(results);
}, 5);
});
}
var c = function (results) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
results.push("c");
console.log("c(): ", results);
resolve(results);
}, 10);
});
}
var callABC = function (results) {
console.log("callABC()...");
a(results)
.then(b)
.then(c)
.then(function (results) {
console.log("Done: results:", results);
})
.catch(function (err) {
console.log("Error:", err);
});
}
callABC([]);
我知道手动实例化你自己的这样的承诺可以被认为是"坏":
问:我怎样才能宣传"上面的片段?
我尝试了很多东西;他们都没有工作。例如:
/*
* Try using Bluebird promisify():
* - Fails: never calls b() or c()
*/
var Promise = require('bluebird');
var a = Promise.promisify(function (results) {
setTimeout(function() {
results.push("a");
console.log("a(): ", results);
}, 15);
});
var b = Promise.promisify(function (results) {
setTimeout(function() {
results.push("b");
console.log("b(): ", results);
}, 5);
});
var c = Promise.promisify(function (results) {
setTimeout(function() {
results.push("c");
console.log("c(): ", results);
}, 10);
});
var callABC = function (results) {
console.log("callABC()...");
a(results)
.then(b)
.then(c)
.then(function (results) {
console.log("Done: results:", results);
})
.catch(function (err) {
console.log("Error:", err);
});
}
callABC([]);
问:" promisify"的正确方法是什么?第一个例子?
问:特别是,我如何解决()"或"拒绝()"如果我将自动Promise.promisify()
或Promise.promisifyAll()
替换为手册new Promise()
,我的回调是什么?我想象"扔"调用.catch()
,但还有另一个(更好的?)机制吗?
答案 0 :(得分:0)
答案是:"并非所有JS功能都可以被宣传"。具体做法是:
http://bluebirdjs.com/docs/api/promise.promisify.html
Promise.promisify)...返回一个将包装给定的函数 nodeFunction。返回的函数将取代回调函数 返回一个承诺,其命运由回调行为决定 给定节点功能。节点函数应符合node.js 接受回调作为最后一个参数并调用它的约定 回调,错误作为第一个参数和成功值 第二个论点。
所以在上面的例子中,"新的承诺"是正确的方法:" Promise.promisify()"不行。