【问题标题】:How to return a value from a regular javascript function that contains a promise chain?如何从包含承诺链的常规 javascript 函数返回值?
【发布时间】:2026-01-05 06:25:01
【问题描述】:
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() 完成执行(即解决承诺),然后再将执行交给调用者,在本例中为bSFI()

调用bSFI() 只会执行bsfir() 中的几行代码。 bSFI() 的执行几乎立即/瞬间完成,可能是因为bsfir() 中的承诺与返回值无关,所以当bSFI() 调用bsfir() 时,执行立即转到response.success(bsfirr);

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

【问题讨论】:

  • 不,你不能那样做。你所能做的就是回报一个承诺。无法使异步操作同步。
  • 谢谢Bergi,返回一个promise 也可以。 bsfir() 中只有 1 或 2 行代码在调用 bsfir() 的瞬间执行,然后在调用者中继续执行,& bsfir() 中的其余代码没有机会运行。在许多其他情况下,如果我将 bsfir() 更改为云代码,它会完美运行。 bSFI() 将调用 bsfir() 并在 bsfir() 完成 100% 后,将 bsfir() 的返回值返回给 bSFI(),然后按预期在 bSFI() 中继续执行。但是由于 bsfir() 是一个常规的 javascript 函数,它的行为并不像预期的那样。

标签: javascript parse-platform promise parse-cloud-code


【解决方案1】:

不,您不能等待承诺解决后再返回。您的任务是异步的,但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(…) 替换为 …()

【讨论】:

  • 谢谢 Bergi,您有时间长期从事更大的项目吗?
  • @HenrySitu:对不起,如果你是这个意思,我不适合雇用,而且肯定不在洛杉矶。
  • @Bergi - 我错过了什么吗?在我看来,链条中的第一个空洞的承诺是多余的。为什么不return Parse.Cloud.run('gRFI', {}).then() {... ? Cloud.run() 返回一个承诺。那应该是链条的开始,对吧?
  • @Bergi 谢谢。如果有任何事情发生,请告诉我。我们总是可以使用 github 之类的东西虚拟地一起为项目做出贡献。
  • @danh:是的,这是多余的,这就是我最后一段的意思。我只是不想过多地更改 OP 的代码,这样return 丢失的地方就更明显了。
最近更新 更多