Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.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_Promise - Fatal编程技术网

Javascript 对承诺的理解

Javascript 对承诺的理解,javascript,promise,Javascript,Promise,我想用nativePromise实现deferred,并做了一些实验 var p, _p; p = new Promise((t, f) => { p.resolve = t; p.reject = f; _p = p; // let's save it into global }); p.then( console.log.bind(console, 'ok'), console.log.bind(console, 'fail') ); console.log(p

我想用native
Promise
实现
deferred
,并做了一些实验

var p, _p;
p = new Promise((t, f) => {
  p.resolve = t; 
  p.reject = f;
  _p = p; // let's save it into global
});
p.then(
  console.log.bind(console, 'ok'), 
  console.log.bind(console, 'fail')
);
console.log(p === _p);      // false!
console.log(typeof p.resolve, typeof _p.resolve); // 'undefined' 'function'
_p.resolve(42); // 'ok' 42
promise函数中指出了什么
p

为什么这是另一个例子?我怎样才能延长返回的时间

在promise函数中指出了什么p

在promise中设置
p
时,您引用的是全局
p
(您声明的)

由于在promise调用之前您没有为
p
设置任何值,因此它的值是
undefined

为什么这是另一个例子?我怎样才能延长返回的时间

因为当您在
p
上设置属性时,您对promise的调用尚未完成。浏览器首先执行您发送给promise的参数(即箭头函数),然后使用参数调用promise,然后才将promise的返回值指定给变量
p
(并覆盖您在箭头函数中对
p
所做的任何更改)


扩展返回的Promise对象的唯一方法是在它被创建并分配给您的
p
之后扩展它。谢谢大家指出我的错误。
我最终实现了以下目标:

function Deferred() {
  this.promise = new Promise((ok, fail) => {
    this.resolve = ok;
    this.reject = fail;
  });
}

!function() {
  var p = new Deferred();
  p.promise.then(
    console.log.bind(console, 'ok'), 
    console.log.bind(console, 'fail')
  );
  p.resolve(42); // ok 42
}();  

扩展
Promise
对象是一个坏主意。

p
在定义拒绝和解析函数时,确实会将其附加到拒绝和解析函数:

p = new Promise((t, f) => {
  console.log(p) // it is not defined as a promise
  p.resolve = t; 
  p.reject = f; 
  console.log(p) // p now is defined AND has resolve and reject defined in it
  _p = p // _p now is a promise object with resolve and reject defined 
});
然而,一旦你完成了你的承诺,它就会失去你为它添加的所有额外元素。如果出于任何原因想要扩展
p
,您可以在创建承诺后进行扩展。比如说

p = new Promise((t, f) => {
  console.log(p) // it is already defined as a promise
  p.resolve = t; 
  p.reject = f; 
  console.log(p) // p now has resolve and reject defined in it too
  _p = p // _p now is a promise object with resolve and reject defined 
});
p.extraExtension = "hello"
console.log(p); // at this stage your p will have extraExtension extended to it, but its attributes and status as a Promise are also there. However, simply defining `p.resolve` and `p.reject` wouldn't make them function as proper resolve and reject methods for the promise.
承诺中已定义了
解决
拒绝

调用它们的方法是在promise对象中简单地引用它们:

p = new Promise((t, f) => {
  console.log(p) // it is already defined as a promise
  resolve(t); // the promise will now resolve. Similarly you can call reject() here.
});
有关更多信息,请参阅此处的官方文档:


您可以在那里看到Promise对象的所有固有方法和属性

“ReferenceError:outer\u p未定义
p
未在executor函数中定义。
outer\u p
可能应该是
\u p
,然后脚本按预期工作<代码>\u p将
未定义
是,抱歉。我把它改名为simplify。只是错过了one@vp_arth我不明白,在您发布的代码中,
p
在executor回调中是如何定义的。这就像在函数完成执行之前得到函数的结果(它相当于
var value=void function(){console.log('value=',value);return 123}()
它已经被定义为承诺。只是因为我们不使用干净的范围。它是在同一REPL中的上一次调用中定义的。关于的最后一段:可能不是
resolve(t)
,而是
t()
?无论如何,我的目标是推迟实施。详细阅读我的答案。
p = new Promise((t, f) => {
  console.log(p) // it is already defined as a promise
  resolve(t); // the promise will now resolve. Similarly you can call reject() here.
});