Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript&;承诺中带有Q-闭包问题的承诺_Javascript_Node.js_Coffeescript_Promise_Q - Fatal编程技术网

Javascript&;承诺中带有Q-闭包问题的承诺

Javascript&;承诺中带有Q-闭包问题的承诺,javascript,node.js,coffeescript,promise,q,Javascript,Node.js,Coffeescript,Promise,Q,我使用Node.js和Q编写服务器端异步代码。我不熟悉promises(一般来说,我也不熟悉异步编程),我遇到了一些问题,我无法通过查看Q文档来解决这些问题。以下是我的代码(这是coffeescript-如果您想查看javascript,请告诉我): 希望我的评论能解释这个问题。我想遍历一个类型列表,然后为每个类型运行一个承诺链,但问题是type的值在承诺的范围之外发生了更改。我意识到,对于这样一个简短的列表,我可以展开循环,但这不是一个可持续的解决方案。如何确保每个承诺都看到不同但本地正确的类

我使用Node.js和Q编写服务器端异步代码。我不熟悉promises(一般来说,我也不熟悉异步编程),我遇到了一些问题,我无法通过查看Q文档来解决这些问题。以下是我的代码(这是coffeescript-如果您想查看javascript,请告诉我):


希望我的评论能解释这个问题。我想遍历一个类型列表,然后为每个类型运行一个承诺链,但问题是
type
的值在承诺的范围之外发生了更改。我意识到,对于这样一个简短的列表,我可以展开循环,但这不是一个可持续的解决方案。如何确保每个承诺都看到不同但本地正确的
类型值?

您必须将数据分配闭包封装在另一个闭包中,以便在执行内部闭包之前保留类型值


有关更多详细信息:

您必须将数据分配闭包封装在另一个闭包中,以便在执行内部闭包之前保留type的值


有关更多详细信息:

我不知道CoffeeScript,但这在JS中应该可以使用:

var promises = [];
var templates = {};
var ref = ['html', 'text'];

for (var i = 0, len = ref.length; i < len; i++) {
    var type = ref[i];

    promises.push(Q.nfcall(fs.readFile, "./email_templates/" + type + ".ejs", 'utf8').then((function (type) {
        return function (data) {
            return templates[type] = data;
        };
    }(type))));
}

Q.all(promises).then(function() {
    return console.log('sending email...');
    // ...
}).done(function() {
    // ...
});
重要的部分是:

).then do (type)->
    (data)->
        templates[type] = data

我不知道CoffeeScript,但在JS中应该可以使用:

var promises = [];
var templates = {};
var ref = ['html', 'text'];

for (var i = 0, len = ref.length; i < len; i++) {
    var type = ref[i];

    promises.push(Q.nfcall(fs.readFile, "./email_templates/" + type + ".ejs", 'utf8').then((function (type) {
        return function (data) {
            return templates[type] = data;
        };
    }(type))));
}

Q.all(promises).then(function() {
    return console.log('sending email...');
    // ...
}).done(function() {
    // ...
});
重要的部分是:

).then do (type)->
    (data)->
        templates[type] = data

@MattBall我有一个额外的闭包(请参阅立即调用的函数表达式)。谢谢,John。我相信我明白这里发生了什么。然而,我接受了另一个答案,因为它提供了一个指向问题解释的链接,这比快速修复更有用。@jayhendren没问题。我不管你接受谁,只要你原来的问题解决了@MattBall我有一个额外的闭包(请参阅立即调用的函数表达式)。谢谢,John。我相信我明白这里发生了什么。然而,我接受了另一个答案,因为它提供了一个指向问题解释的链接,这比快速修复更有用。@jayhendren没问题。我不管你接受谁,只要你原来的问题解决了!非常感谢。虽然我没有完全复制这个解决方案,但这篇博文中的解释帮助我创建了一个修复程序。谢谢。虽然我没有完全复制这个解决方案,但这篇博文中的解释帮助我创建了一个修复方案。