【问题标题】:Q not chaining properlyQ没有正确链接
【发布时间】:2016-12-29 02:24:23
【问题描述】:

我尝试链接承诺。下面的 getExternalMap() 返回一个承诺(处理一个 ajax 调用 => deferred.resolve() 并返回 deferred.promise)。 “第一次链接”被调用没有问题,但“第二次链接”没有被调用,知道为什么吗?

我认为它写得很好,但事实并非如此,我还找不到原因。

var self = this;
getExternalMap().then(function() {
        console.log("First chaining");
        var parsedMap = self.destinationsApiParser.getSortDestinations();
        return self.initProxies(parsedMap);
    }).then(function() {
        console.log('second chaining');
    });

this.initProxies = function(parsedMap) {
    var deferred = Q.defer();
    var destinationsApiProxy = new DestinationsApiProxy(this.app, parsedMap);
    deferred.resolve();
    return deferred.promise;
}

【问题讨论】:

  • catch()done() 添加到链的末尾以查看任何错误。
  • initProxies 不应返回承诺。它不是异步的。
  • 多亏了 sirko,才发现问题,initProxies 做的很糟糕,有点安静地崩溃了。另外,Bergi 的评论也不错。谢谢你们俩
  • @FrançoisRichard:是的。 then 很神奇,它检测你是否返回一个承诺(并等待它)(并立即解决)。
  • process.on("unhandledRejection", e => { throw e; }) 应该刷新错误。这适用于 Q 一年多。

标签: javascript node.js promise q


【解决方案1】:

如果我理解正确,你想这样做:

var self = this;
getExternalMap()
    .then(() => console.log("1st chaining"))
    .then(self.destinationsAPIParser.getSortDestinations)
    .then(self.initProxies)
    .then(() => console.log("2nd chaining"))

this.initProxies = function(parsedMap) {
    var deferred = Q.defer();
    var destinationsApiProxy = new DestinationsApiProxy(this.app, parsedMap);
    deferred.resolve();
    return deferred.promise;
}

假设 self.destinationsAPIParser.getSortDestinations 返回一个承诺。

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2013-11-06
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多