javascript - promise 链接返回未定义

标签 javascript angularjs promise

我正在尝试进行 promise 链接,但我得到 undefined对于我的链条中的一部分,我不确定为什么。问题似乎是当我使用 serviceFactory.GetProjectManager() 时。当我返回时,它似乎没有返回 promise ,而是自动进入下一个 .then()解析值为 undefined

如果GetProjectManager返回一个字符串,我从函数调用中返回该字符串,它不会将其包装在 promise 中并传递到下一个 promise 链吗?

  dataFactory.GetProject()
    .then(function(result){
        return result.Response.ProjectId;
    }).then(function(projectId){
        return serviceFactory.GetProjectManager(projectId);
    })
    .then(function(result){
        //GET UNDEFINED HERE <---------
    })
    .catch(function(error){

    });

如果我编写如下代码,那么它将在回调中返回正确的值,但我不想使用回调,我想使用扁平化的 promise 链。

dataFactory.GetProject()
    .then(function(result){
        return result.Response.ProjectId;
    }).then(function(projectId){
        serviceFactory.GetProjectManager(projectId
            ,function(result){
                //Returns Project Manager Here <----
            }
            ,function(error){

        });
    })
    .catch(function(error){

    });

最佳答案

正如您在评论中指出的那样,GetProjectManager 似乎接受回调(并返回 undefined),而不是返回 Promise。

您可以将原始的基于回调的函数包装到返回 Promise 的函数中,然后调用它:

function GetProjectManagerAsync (serviceFactory, projectId) {
    return $q(function (resolve, reject) {
        serviceFactory.GetProjectManager(projectId, resolve, reject)
    })
}

dataFactory.GetProject()
    .then(function(result){
        return result.Response.ProjectId
    })
    .then(function (projectId){
        return GetProjectManagerAsync(serviceFactory, projectId)
    })
    .then(function (projectManager) {
        // do something neat with `projectManager`
    })
    .catch(function (error){
        throw error // or do real error handling
    })

还有一些很棒的库可以自动为您执行此操作,例如 Thenify .

编辑:谢谢Bergi for 指出 Angular.js 的 promise 在这里更有意义。

关于javascript - promise 链接返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41111403/

相关文章:

javascript - JQuery:使用 () => {} 和 function() 语法,后者有效

javascript - Angularjs 删除 JSon 对象

node.js - 如何使用 mocha 和 chai 正确测试 Promise?

javascript - 有没有办法在 AngularJs 中使用两个 ng-apps,比如父应用程序和子应用程序?

node.js - ES6 Promises - 在 Promise 链中调用同步函数

angular - 我如何让 Angular 5 等待 Injectable 的构造函数中使用的 Promise 在构造依赖项或 ngOnInit 之前解析?

javascript - 如何在 mocha root hook 插件中调用 await

javascript - Angular 路由失败 - 模态弹出窗口

javascript - MVC中如何设置元素的属性

javascript - 正确保存数据到mongoDB