如何 return 来自包含承诺链的常规 javascript 函数的值?

How to return a value from a regular javascript function that contains a promise chain?

function bsfir() {
    Parse.Promise.as().then(function() {
        return Parse.Cloud.run('gRFI', {});
    }).then(function(gRFIr) {
        return Parse.Cloud.run('gFI', { });
    }).then(function(gFIR) {
        return gFIR;
    }, function(error) {
        return error;
    });
}

Parse.Cloud.define("bSFI", function(request, response) {
    Parse.Promise.as().then(function() {
        return bsfir();
    }).then(function(bsfirr) {
        response.success(bsfirr);
    }, function(error) {
        response.error("219 error: " + JSON.stringify( error));
    });
});

目标是 bsfir() 在将执行交还给调用者之前完成执行(即 resolve the promise),在本例中为 bSFI()

调用 bSFI() 结果只执行 bsfir() 中的几行代码。 bSFI() 的执行几乎 immediately/instantaneously 可能是因为 bsfir() 中的承诺没有绑定到 return 值,所以当 bSFI() 调用 bsfir() , 立即执行到 response.success(bsfirr);

bsfir() 中使用 Promise.all() 是一个好的解决方案吗?

不,您不能等到 promise 在您 return 之前解决。您的任务是异步的,但 return 必须立即发生。

但是您可以做的只是 return 承诺(来自您的)本身,并让您的调用者等待它。事实上,您的 bSFI() 已经使用了 promise,因此集成起来很简单。

function bsfir() {
    return Parse.Promise.as().then(function() {
//  ^^^^^^
        return Parse.Cloud.run('gRFI', {});
    }).then(function(gRFIr) {
        return Parse.Cloud.run('gFI', {});
    });
}

Parse.Cloud.define("bSFI", function(request, response) {
    Parse.Promise.as().then(bsfir).then(function(bsfirr) {
        response.success(bsfirr);
    }, function(error) {
        response.error("219 error: " + JSON.stringify( error));
    });
});

请注意,您应该能够在两个函数中将 Parse.Promise.as().then(…) 替换为 …()