使用Javascript和承诺符合Q - 在承诺关闭问题(Javascript & promise

2019-10-19 02:16发布

我如何使用Node.js和Q编写服务器端异步代码。 我是新来的承诺(我是新来的,一般异步编程),和我有一点麻烦,我一直无法通过在Q文件盯着解决。 这里是我的代码(这是CoffeeScript的 - 让我知道如果你想看到的JavaScript代替):

templates = {}
promises = []
for type in ['html', 'text']
    promises.push Q.nfcall(fs.readFile
        , "./email_templates/#{type}.ejs"
        , 'utf8'
        ).then (data)->
            # the problem is right here - by the time
            # this function is called, we are done
            # iterating through the loop, and the value 
            # of type is incorrect
            templates[type] = data
Q.all(promises).then(()->
    console.log 'sending email...'
    # send an e-mail here...
).done ()->
    # etc

希望我的评论说明了问题。 我想通过一个类型列表进行迭代,然后运行的承诺为每种类型的链,但问题是,值type正在发生变化的承诺的范围之外。 我认识到,这样的短名单,我可以展开循环,但是这不是一个可持续的解决方案。 我怎么能保证每个诺言看到的不同但局部正确的值type

Answer 1:

你必须封装的数据分配封闭在另一封,这样,直到执行内部闭合类型的值将被保留。

欲知详情: http://www.mennovanslooten.nl/blog/post/62



Answer 2:

我不知道的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() {
    // ...
});

编辑:CoffeeScript的翻译:

templates = {}
promises = []
for type in ['html', 'text']
    promises.push Q.nfcall(fs.readFile
        , "./email_templates/#{type}.ejs"
        , 'utf8'
        ).then do (type)->
            (data)->
                 templates[type] = data
Q.all(promises).then(()->
    console.log 'sending email...'
).done ()->
    console.log '...'

重视存在的部分:

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


文章来源: Javascript & promises with Q - closure problems in promises