首页 > 解决方案 > 函数中的promise和var等于promise之间的Javascript区别

问题描述

我正在尝试处理一些承诺,但我对以下两种使用承诺的方式之间的区别感到有些困惑:

第一种方法:

function myfunction() {
  return new Promise((resolve, reject) => {
    // do stuff
  });
}

第二种方法:

var myfunction = new Promise((resolve, reject) => {
 // do stuff
});

这两者有什么区别?

是否有偏好何时使用其中一种?

标签: javascriptpromise

解决方案


简而言之,您的两个示例就像比较这两个语句:

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
});

创建一个新的承诺并将承诺本身分配给您的变量myfunction。此代码运行后,myfunction将包含一个承诺。

所以,在第一个例子myfunction中是一个函数。在第二个例子中,myfunction是一个承诺。

这两者有什么区别?

如上所述,它们是用于不同目的的不同代码段。

是否有偏好何时使用其中一种?

这取决于你想做什么。如果您想定义一个可重复使用的函数,您可以多次调用它来创建一个 Promise(可能会跟踪一些异步操作),那么您将使用第一个函数,并且每次您想要运行异步操作时都会调用它,并且收回承诺。

如果您想(仅此一次)创建一个承诺并将其放入变量中,您将使用第二个。不同的代码结构用于不同的目的,做不同的事情。


请记住,promise 只是一个普通的 Javascript 对象,它充当通知系统,用于跟踪和通知其他代码有关异步操作的完成。当您执行new Promise()所有操作时,就会创建一个新的 Javascript 对象。Promise 只是简单的 Javascript 对象,带有一些方法和一些实例数据。他们没有观察任何事物的魔力。事实上,他们只做他们被告知的事情。有些人认为他们以某种方式自动知道它们内部的异步操作何时完成。他们不。您必须手动挂钩到异步操作的完成操作并手动调用resolve(...)or reject(...)。当你这样做时,promise 将通知任何已经安装了自己的侦听器.then(...)or .catch(...)


推荐阅读