我怎样才能满足这些功能?

时间:2016-05-03 18:53:24

标签: node.js promise bluebird

我使用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(),但还有另一个(更好的?)机制吗?

问:有什么限制吗?例如,函数是否需要有一个回调参数才能被宣传为#34;?

1 个答案:

答案 0 :(得分:0)

答案是:"并非所有JS功能都可以被宣传"。具体做法是:

http://bluebirdjs.com/docs/api/promise.promisify.html

  

Promise.promisify)...返回一个将包装给定的函数   nodeFunction。返回的函数将取代回调函数   返回一个承诺,其命运由回调行为决定   给定节点功能。节点函数应符合node.js   接受回调作为最后一个参数并调用它的约定   回调,错误作为第一个参数和成功值   第二个论点。

所以在上面的例子中,"新的承诺"是正确的方法:" Promise.promisify()"不行。