承诺回调参数来自哪里

Posted

技术标签:

【中文标题】承诺回调参数来自哪里【英文标题】:Where do the promise callback arguments come from 【发布时间】:2022-01-01 14:28:21 【问题描述】:

我研究承诺。典型的承诺如下所示:

let cleanMyRoomPromiseCallback = function(resolve, reject) //where "resolve" and "reject" come from?
	resolve("My room is clear!");	


let cleanMyRoom = new Promise(cleanMyRoomPromiseCallback)
.then((onCleanMyRoomResolve)=> 
	console.log(onCleanMyRoomResolve);
)

函数cleanMyRoomPromiseCallback有两个参数:resolvereject。当该函数被传递给Promise 的构造函数时,在我看来它们没有被定义。这些标识符只是一些文本。他们是如何评价的?它们是否来自Promise 构造函数本身/评估?

【问题讨论】:

是的。 Promise 构造函数调用传递的回调并传递resolve 和reject 函数。这些函数的实际作用取决于浏览器的实现。 【参考方案1】:

promise 构造函数的行为如下:

 function Promise(callback)
   const handlers = [];

   function resolve(value)
     for(const [success] of handlers)
        if(success) success(value);
   

  function reject(error)
     for(const [, catch] of handlers)
        if(catch) catch(error);
  

  // Now call the callback and pass the functions:
  callback(resolve, reject);

  // Return the created promise...

【讨论】:

【参考方案2】:

是的,Promise 构造函数将一个函数作为参数,它还需要 2 个函数作为参数(您在此处看到的 resolvereject 函数)。如果您想了解更多关于 Promise 构造函数的信息,MDN 文章是一个快速入门的好方法:

https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Promise

【讨论】:

【参考方案3】:

我将回答“回调参数从何而来?”这一更广泛的问题

简短的回答是,参数由调用回调的任何对象传递。

一个简单的例子应该可以清楚地说明这一点。

如果我们定义一个接受回调的函数:

function example(callback) ...

回调需要在函数内的某个地方调用才能发挥作用:

function example(callback) 
  callback('Hello World!')

当你想使用该函数时,你需要知道将哪些参数传递给回调。在我们的示例中,只有一个参数,因此回调应该处理该参数:

example(function (text) 
  console.log(text) // writes "Hello World!" to the console
)

当您使用new Promise 时,构造函数在调用其回调时传递两个作为函数的参数。

【讨论】:

以上是关于承诺回调参数来自哪里的主要内容,如果未能解决你的问题,请参考以下文章

如何等到回调被调用

config.json 预训练模型调参

承诺回调返回承诺

决策树决策树调参

为啥回调比承诺更“紧密耦合”?

了解回调和承诺。它是不是正确?