我正在尝试兑现一些诺言,但对以下两种使用诺言的方式之间的区别感到困惑:
第一种方法:
function myfunction() {
return new Promise((resolve, reject) => {
// do stuff
});
}
第二种方法:
var myfunction = new Promise((resolve, reject) => {
// do stuff
});
这两者有什么区别?
是否优先选择何时使用另一个?
答案 0 :(得分:1)
简而言之,您的两个示例就像比较这两个语句:
var x = 1;
var x = function() { return 1;}
第一个定义变量并为其分配值。 第二个变量定义了一个变量并为其分配了一个函数。在执行任何操作或产生任何特定值之前,必须先调用该函数。
您的第一个代码示例:
function myfunction() {
return new Promise((resolve, reject) => {
// do stuff
});
}
是一个创建并返回新诺言的函数。当它被调用时。您必须先调用该函数,然后才能执行任何操作。如您所显示的代码仅定义了一个函数,但实际上并未运行任何东西。 myfunction
是一个函数。要获得承诺,您必须按以下方式调用该函数:
myfunction().then(...).catch(...)
您的第二个代码示例:
var myfunction = new Promise((resolve, reject) => {
// do stuff
});
创建一个新的Promise,并将Promise本身分配给变量myfunction
。此代码运行后,myfunction
将包含一个承诺。
因此,在第一个示例中,myfunction
是一个函数。在第二个示例中,myfunction
是一个承诺。
这两者有什么区别?
如上所述,它们是用于不同目的的不同代码。
是否优先选择何时使用另一个?
这取决于您想做什么。如果您想定义一个可重用的函数,您可以多次调用它来创建一个Promise(大概跟踪一些异步操作),那么您将使用第一个函数,并且每次您要运行异步操作时都将调用它,并且兑现承诺。
如果您想(仅此一次)创建一个promise并将其放入变量中,则可以使用第二个。用于不同目的的不同代码构造会执行不同的操作。
请记住,promise只是一个普通的Javascript对象,它用作通知系统,用于跟踪和通知其他代码异步操作的完成。当您执行new Promise()
时,会创建一个新的Javascript对象。承诺只是带有一些方法和一些实例数据的普通Javascript对象。他们没有观察任何事物的魔力。实际上,他们只是按照所告诉的去做。有人认为他们以某种方式自动知道何时在他们内部执行异步操作。他们不。您必须手动加入异步操作的完成操作,并手动调用resolve(...)
或reject(...)
。当您这样做时,promise将通知使用.then(...)
或.catch(...)
安装了自己的所有侦听器。