这样函数的调用者(服务的用户)可以使用。然后如果他想对函数生成的信息做某事。如果他不关心什么时候完成,只要它在某个时候完成,他就可以在没有任何基础设施的情况下调用该函数。
这会有用吗?我不想进入我的测试中会起作用的情况,但是在一些不经常发生的模糊情况下,它会失败。
嗯。我猜我的意思是这个。如果我正在编写返回承诺的例程,我不得不说:
return new Promise(function (resolve, reject) { ... });
如果我的来电者没有说:
.then(function () { ... }, function () { ... });
会发生什么?我会在某个时候调用resolve()或reject(),并且不会定义resolve和reject。 Promise构造函数是否提供了一些默认(不执行任何操作)定义?
我想如果我是一个疯狂的人,我可以在我的被叫函数中说:
(resolve || function () {})();
答案 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)
。