在Node.js中与q和Promise有点混淆

格罗菲特

我目前在nodejs中有一些js文件,这些文件作为模块加载并扩展了app对象(使用express)。

所以他们的签名看起来像:

module.exports = function(app, callback) { 
   // ... 
   callback();
}

因此,目前大约有5个,我的代码如下:

require("./setup/a")(app, function() {
    require("./setup/b")(app, function(){
        require("./setup/c")(app, function(){
            require("./setup/d")(app, function(){
                require("./setup/e")(app, function(){
                    startApp();
                })
            })
        })
    })
});

现在看起来不雅观,作为其“厄运的金字塔”,但我不完全相信我需要如何改变这种模式使用Q,因为我是假设我会使用Q.fcall(...a).then(...b).etc.done()但是我不确定如何将应用程序传递给它,以及是否需要返回回调以使其作为承诺进行处理。

理想情况下,我不想在代码中全力以赴,只希望在要删除金字塔用例的地方使用Q,因此在上面的示例中,我如何结合使用Q和Promise将应用程序传递到每个必需的模块中然后在最后启动应用程序?

本杰明·格伦鲍姆(Benjamin Gruenbaum)

假设您的模块尚未使用promise,您可以执行以下操作:

module.exports = function(app) { 
    // do some stuff with app
    return new Promise(function(resolve,reject){
        // when ready to resolve after some actions on app
        resolve(); // you can also return a value here as a cb param
    });
};

Promise.all(["./setup/a","./setup/b","./setup/c"].map(require.bind(null,app)))
  .then(startApp);

但是,您应该在尽可能低的级别上使用promise,这意味着您可以简单地返回在过程中使用的promise:

module.exports = function(app){
     return something(app).then(function(){
         return somethingElseAsyncWithApp(app);
     });
};

因此,promise构造器不是必需的。请注意,此答案使用本机承诺,但也适用于使用该语法的库(例如Bluebird)。对于Q值变new Promisenew Q.PromisePromise.allQ.all

或者,你可以改变每require(x)Q.fcall(require,x)和使用Q.all直接,但既慢(虽然Q是慢反正)和更多的错误不是直接promisifying模块容易。最好尽可能保证最低级别的API。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Node.js中与q和Promise有点混淆

来自分类Dev

Node.js中的异步和Q Promise

来自分类Dev

有点与JavaScript中的Promise / Chained函数混淆

来自分类Dev

与AVFoundation有点混淆

来自分类Dev

有点与因子捆绑和grunt-browserify混淆了

来自分类Dev

如何在node.js中实际使用Q promise?

来自分类Dev

在Node JS中限制Q许诺并发

来自分类Dev

JavaScript Promise和Node.js

来自分类Dev

Q Promise Node.js如何循环解析

来自分类Dev

Node JS Async Promise。所有问题

来自分类Dev

Promise 在 Node JS 中不起作用

来自分类Dev

延迟链接,Node.js和q,所有链部分的单个ErrorHandler

来自分类Dev

如何从Q Node Promise返回变量?

来自分类Dev

被Node.js readline on()方法混淆

来自分类Dev

Node.js与Promise并行

来自分类Dev

std.json-有点与TRUE,FALSE和NULL值混淆

来自分类Dev

std.json-有点与TRUE,FALSE和NULL值混淆

来自分类Dev

在 JavaScript 提升和函数作用域之间有点混淆

来自分类Dev

带有node.js的Q异步库

来自分类Dev

node.next = node 和 node=node.next 的区别

来自分类Dev

XPath中的“ / node()”和“ node()”有什么区别?

来自分类Dev

使用Q Promises在node.js中链接GET请求

来自分类Dev

使用node.js,流和promise下载文件

来自分类Dev

Node.js中的Promise无法正常工作并没有错误

来自分类Dev

Promise 在我的 Node JS 应用程序中没有按预期工作

来自分类Dev

在Node.js中使用Q.js Promise进行循环的正确方法

来自分类Dev

Node.js没有执行异步的Promise函数

来自分类Dev

带有 Node.js Promise 的函数参数

来自分类Dev

如何在Node.js中从Promise中获取价值