一个函数能否返回一个承诺?

时间:2016-08-05 20:58:25

标签: javascript promise

这样函数的调用者(服务的用户)可以使用。然后如果他想对函数生成的信息做某事。如果他不关心什么时候完成,只要它在某个时候完成,他就可以在没有任何基础设施的情况下调用该函数。

这会有用吗?我不想进入我的测试中会起作用的情况,但是在一些不经常发生的模糊情况下,它会失败。

嗯。我猜我的意思是这个。如果我正在编写返回承诺的例程,我不得不说:

return new Promise(function (resolve, reject) { ... });

如果我的来电者没有说:

.then(function () { ... }, function () { ... });

会发生什么?我会在某个时候调用resolve()或reject(),并且不会定义resolve和reject。 Promise构造函数是否提供了一些默认(不执行任何操作)定义?

我想如果我是一个疯狂的人,我可以在我的被叫函数中说:

(resolve || function () {})();

3 个答案:

答案 0 :(得分:1)

返回承诺的函数将执行您希望它执行的操作。

给定函数B():

如果用户没有链接B()。then(),那么无论何时完成,他们都会得到答案。由他们来处理他们不知道何时填充值的事实。这是可以预期的。

如果用户确实链B()。then(),他们将有一个很好的方法来控制返回值后发生的事情。

您无需担心奇怪的边缘情况。返回承诺的函数是一个清晰明了的合同。

答案 1 :(得分:1)

与Javascript中的所有函数一样,调用者可以忽略返回值。 Javascript垃圾收集器将处理不再使用的对象或值。

因此,如果某个返回承诺的异步操作的调用者在完成时确实不关心,或者如果有错误,那么调用者可以自由地忽略返回的promise。没有什么不好的事情发生(除了你可能永远不知道有错误的事实)。

你的问题中似乎并不酷的部分就是你说的话: "如果他在完成任务时并不关心,只要它得到了有时完成" 。如果你忽略异步错误,那么这可能实际上不会在某个时候完成,你可能永远不会知道。在这种情况下,可能更合适:

someAsyncFunc(...).catch(function(err) {
    console.err(err);
    // so something meaningful with the error here
});

答案 2 :(得分:-1)

除非您特别需要包装旧API,否则使用Promise构造函数是反模式。请改用Promise工厂,或者如果使用bluebird,请查看是否可以在遗留功能上使用bluebird的promisify

您似乎也误解了Promise构造函数参数的参数是什么。它们不是回调,它们是解决Promise的功能。承诺本身会担心通知任何回调,如果存在的话。

此外,如果您的函数有时会返回Promise,有时则不会,那么您可能会崩溃任何假定它可以在函数的返回值上调用.then的代码。不要那样做。

如果您的计算可能是异步的,请始终返回Promise。如果要返回已结算的值,请返回Promise.resolve(theValue)