我正在查看Angular文档中$q的例子,但我认为这可能适用于一般的承诺。下面的例子是从他们的文档中逐字复制的,包括他们的评论:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1

我不清楚这是怎么回事。如果我可以对第一个.then()的结果调用.then(),将它们链接起来,我知道我可以,那么promiseB是一个promise对象,类型为object。它不是一个数字。那么“它的值将是承诺a加1的结果”是什么意思呢?

我应该像承诺的那样访问吗?。价值或类似的东西?如何成功回调返回承诺和返回“结果+ 1”?我遗漏了一些东西。


当前回答

promiseA(pram).then(
     result => { 
     //make sure promiseA function allready success and response
     //do something here
}).catch(err => console.log(err)) => {
     // handle error with try catch
}

其他回答

我学习JavaScript的速度很慢。默认情况下,所有异步函数都返回一个promise,你可以将结果包装为:

(async () => {
//Optional "await"
  await yourAsyncFunctionOrPromise()
    .then(function (result) {
      return result +1;
    })
    .catch(function (error) {
      return error;
    })()
})

从等待(MDN):

await表达式导致异步函数的执行暂停,直到Promise被解决(即,实现或拒绝),并在实现后恢复异步函数的执行。当恢复时,await表达式的值是已实现的Promise的值。 如果Promise被拒绝,await表达式抛出被拒绝的值

在MDN网络文档中阅读更多关于等待和承诺的信息。

Pixelbits的答案是正确的,您应该始终使用.then()来访问生产代码中承诺的值。

但是,有一种方法可以在promise被解析后直接访问它的值,方法是使用以下不支持的内部Node.js绑定:

process.binding('util').getPromiseDetails(myPromise)[1]

警告:过程。binding从未打算在Node.js核心之外使用,Node.js核心团队正在积极考虑弃用它

文档:流程的弃用文档。绑定# 22004 从流程迁移。绑定# 22064

promiseA的then函数返回一个新的promise (promiseB),它在promiseA被解析后立即被解析,它的值是在promiseA内的成功函数返回的值。

在这种情况下,用值- result解析promiseA,然后立即用值result + 1解析promiseB。

访问promiseB的值的方法与访问promiseA的结果的方法相同。

promiseB.then(function(result) {
    // here you can use the result of promiseB
});

截至ECMAScript 2016 (ES7, 2016), async/await是JavaScript的标准,这允许使用上述方法的替代语法。现在你可以这样写:

let result = await functionThatReturnsPromiseA();
result = result + 1;

现在没有了promisb,因为我们已经使用await来解包了来自promisa的结果,并且您可以直接使用它。

然而,await只能在异步函数中使用。因此,为了稍微缩小,上面的内容必须像这样包含:

async function doSomething() {
    let result = await functionThatReturnsPromiseA();
    return result + 1;
}

而且,为了清晰起见,在这个例子中,函数doSomething的返回值仍然是一个承诺——因为异步函数返回承诺。因此,如果你想访问返回值,你必须执行result = await doSomething(),这只能在另一个异步函数中执行。基本上,只有在父异步上下文中才能直接访问从子异步上下文中产生的值。

这里有一些很好的之前的答案,这里是ES6箭头函数版本:

var something = async() => {
    let result = await functionThatReturnsPromiseA();
    return result + 1;
}

我觉得这个例子不言自明。注意await是如何等待结果的,所以你错过了Promise的返回。

cryA = crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
Promise {<pending>}
cryB = await crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
{publicKey: CryptoKey, privateKey: CryptoKey}