【问题标题】:Why does Q's thenResolve method return undefined?为什么 Q 的 thenResolve 方法返回 undefined?
【发布时间】:2013-11-17 21:18:11
【问题描述】:

为什么thenResolve 没有按我的预期工作?

我在 javascript 模块中有一个方法:

function addVisit(companyId) {
    var  newVisit;

    return getInventoryItems()
        .then(function(data) {
            newVisit = createVisit(companyId, data);
        })
        .then(function() {
            breezeVisitsManager.saveChanges();
        })
        .thenResolve(newVisit);
}

被另一个模块调用:

visitRepository.addVisit(self.companyId)
    .then(function(newVisit) {
        var route = self.visitRoute(newVisit.VisitId());
        router.navigate(route);
     }

newVisit 在调用 thenResolve 时存在,但在调用代码接收到它时它是未定义的。我玩过sample JSFiddle,但我不明白为什么我的代码不起作用。

【问题讨论】:

    标签: breeze promise q


    【解决方案1】:

    newVisit 在您将其传递给 .thenResolve 时是 undefined(在调用 addVisit 时立即)。

    function addVisit(companyId) {
        var  newVisit;
    
        return getInventoryItems()
            .then(function(data) {
                newVisit = createVisit(companyId, data);
            })
            .then(function() {
                breezeVisitsManager.saveChanges();
            })
            .then(function(){
                return newVisit;
            });
    }
    

    Promise 不会改变语言,a.b.c() 无论如何都会立即调用c()

    【讨论】:

    • 感谢您的回答,我稍后再试试。但是,Q API 文档说 thenResolve “一种糖方法,相当于 promise.then(function () { return value; })”,所以你的答案与我的代码不一样吗?而且我不明白你的最后一句话——假设 a、b 和 c 是承诺,在 a、b 和 c 完成之前,不会调用提供给 c 的函数。
    • @JamieIde 不 - 看来您是 Javascript 新手。它们在字面上并不等价,就像在这种情况下它们不是因为newVisit 不是一个值而是一个变量。我想这部分的文档可以改进。该语言不知道某事是否是一个承诺,a().b().c() 中的所有内容都会立即执行。但是,任何传递给 a、b 或 c 的函数都会被代码调用,这使得 Promise 可以正常工作。
    • 相反,我使用 Javascript 已经 10 多年了,但我对 Promise 很陌生。我试过你的答案,它有效,所以谢谢你。
    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多