Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获取承诺的价值?_Javascript_Angularjs_Promise_Angular Promise - Fatal编程技术网

Javascript 如何获取承诺的价值?

Javascript 如何获取承诺的价值?,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我正在看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 prom

我正在看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
。它不是一个
编号
。那么他们所说的“它的价值将是允诺增加1的结果”是什么意思呢


我应该以promiseB.value或类似的方式访问它吗?成功回调如何返回承诺并返回“结果+1”?我遗漏了一些东西。

promiseA
然后
函数返回一个新的承诺(
promiseB
),该承诺在
promiseA
解析后立即解析,其值是从
promiseA
中的success函数返回的值

promiseB.then(function(result) {
    // here you can use the result of promiseB
});
在这种情况下,
promiseA
使用值-
result
解析,然后立即使用值
result+1
解析
promiseB

访问
promiseB
的值的方式与我们访问
promiseA
的结果的方式相同

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

2019年12月编辑:
async
/
await
现在是JS中的标准,允许使用上述方法的替代语法。你现在可以写:

let result = await functionThatReturnsPromiseA();
result = result + 1;
现在没有promiseB,因为我们已经使用
wait
打开了promiseA的结果,您可以直接使用它

但是,
await
只能在
async
函数中使用。因此,要稍微缩小,必须像这样包含上述内容:

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

。然后
允诺人的功能接收从
返回的内容。然后
允诺人的功能


promiseA返回的是一个数字,它将作为promiseB成功函数中的
number
参数提供。然后,它将增加1,解析注释可能会有帮助,但与您当前的理解略有不同:

// promiseB will be resolved immediately after promiseA is resolved
这表明,
promiseB
是一项承诺,但将在
promiseA
解决后立即解决。另一种理解方法是,
promiseA.then()
返回分配给
promiseB
的承诺

// and its value will be the result of promiseA incremented by 1
这意味着
promiseA
解析为的值是
promiseB
将作为其成功回调值接收的值:

promiseB.then(function (val) {
  // val is now promiseA's result + 1
});

当承诺被解析/拒绝时,它将调用其成功/错误处理程序:

var promiseB = promiseA.then(function(result) {
   // do something with result
});
then
方法还返回一个承诺:promiseB,它将根据promiseA的成功/错误处理程序的返回值被解析/拒绝

promiseA的成功/错误处理程序可以返回三个可能会影响promiseB结果的值:

1。不返回任何内容-->PromiseB立即得到解决,
而undefined则传递给promiseB的成功处理程序
2.返回一个值-->PromiseB立即解析,
并将该值传递给promiseB的成功处理程序
3.返回承诺-->解决后,promiseB将得到解决。
拒绝时,承诺人将被拒绝。传递给的值
允诺人当时的经办人将是允诺的结果
有了这种理解,您可以理解以下内容:

promiseB = promiseA.then(function(result) {
  return result + 1;
});
然后电话立即返回promiseB。 当promiseA得到解决时,它会将结果传递给promiseA的成功处理程序。
由于返回值是promiseA的结果+1,成功处理程序将返回一个值(上面的选项2),因此promiseB将立即解析,promiseB的成功处理程序将被传递给promiseA的结果+1。

这个小的Typescript代码示例可能会有所帮助

private getAccount(id: Id) : Account {
    let account = Account.empty();
    this.repository.get(id)
        .then(res => account = res)
        .catch(e => Notices.results(e));
    return account;
}

这里,
repository.get(id)
返回一个
Promise
。我在
然后
语句中将其分配给变量
account

您可以使用javascript中的异步等待方法轻松实现这一点

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
}
下面是使用超时检索WebRTC承诺值的示例

函数等待\u getipv4(超时=1000){
var t1=新日期();
而(!window.ipv4){
var stop=新日期()-t1>=超时;
如果(停止){
console.error('await_getipv4'超过超时时间);
返回false;
}
}
返回window.ipv4;
}
函数async_getipv4(){
var=null;
(二)新的承诺(二)新的承诺(二)新的承诺(二)新的承诺(二)新的(二)新的承诺(二)新的承诺(二)新的承诺(二)新的(二)新的(二)新的(二)新的承诺(二)新的承诺(二)新的承诺(二)新的承诺(二)新的(二)新的(二)新的)的(二)新的)承诺(二)新的)新的(二)承诺(二)新的)新的(二)承诺(二)新的(二)新的)承诺(二)新的(二)承诺(二)新的)承诺(二)新的承诺(二)新的承诺(二)承诺(二)新的承诺(二)新的承诺(二)新的(二)新的)承诺(二)承诺(二)新的承诺(二)新的(二)新的)承诺(二)的(二)承诺(二)新的)的)的f0-9]{1,4}{7})/g.forEach(r)}捕获(e){}})
然后(ip=>window.ipv4=ip);
返回wait_getipv4();

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

但是,有一种方法可以在通过使用以下不受支持的内部node.js绑定解析承诺后直接访问承诺的值:

process.binding('util').getPromiseDetails(myPromise)[1]
警告:process.binding从来就不是要在nodejs核心之外使用的,nodejs核心团队正在积极地反对它


我发现这个例子不言自明。注意wait是如何等待结果的,因此您错过了被返回的承诺

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}
cryA=crypto.minute.generateKey({name:'ECDH',namedCurve:'P-384',true,[“deriveKey”,“deriveBits”])
承诺{}
cryB=await crypto.minute.generateKey({name:'ECDH',namedCurve:'P-384'},true,[“deriveKey”,“deriveBits”])
{公钥:加密密钥,私钥:加密密钥}
在节点REPL中,获取
node -i -e "$(< index.js)"
var something = async() => {
   let result = await functionThatReturnsPromiseA();
   return result + 1;
}
(async () => {
//Optional "await"
  await yourAsyncFunctionOrPromise()
    .then(function (result) {
      return result +1;
    })
    .catch(function (error) {
      return error;
    })()
})