如何将参数传递给Promise函数


122

这似乎是一个愚蠢的问题,但是我是这个话题的新手。我正在致力于关于节点js的承诺。我想将参数传递给Promise函数。但是我不知道。

someModule.someFunction.then(username, password,function(uid) {
  /*stuff */
}

功能类似于

var someFunction = new Promise(username, password, function(resolve, reject) {
  /*stuff using username, password*/
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
});

1
没有理由这样做,你可以定义usernamepassword在较高的范围
adeneo

但是我在调​​用另一个模块的promise,用户名和密码也不是静态的,而是来自客户端的。定义一种函数设置而另一种函数使用的某种全球变量是否安全?是否存在其他客户端更改变量的风险?
kundante

1
@kundante您不需要任何全局变量。了解闭包。
Slaks

@adeneo诺言是异步的-如果他在第一个诺言得到解决之前第二次调用该函数,该怎么办?
Mawg说要

Answers:


233

将Promise包裹在一个函数中,否则它将立即开始工作。另外,您可以将参数传递给函数:

var someFunction = function(username, password) {
  return new Promise(function(resolve, reject) {
    /*stuff using username, password*/
    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
}

然后,使用它:

someModule.someFunction(username, password).then(function(uid) {
  /* stuff */
})

 

ES6:

const someFunction = (username, password) => {
  return new Promise((resolve, reject) => {
    /*stuff using username, password*/

    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
};

用:

someModule.someFunction(username, password).then(uid => {
  /* stuff */
});

是什么someModule
SI 8

3
这只是OP的一个示例
-Shanoor

3
@Shanoor是什么uid?是字符串“工作成功!”吗?
老盖泽

2
@OldGeezer,它只是保存诺言的回报的变量。在这种情况下,是的,这将是“工作成功!”。
Shanoor

您知道如何在新的Promise中从父类调用函数吗?
TimeParadox

7

另一种方法(必须尝试):

var promise1 = new Promise(function(resolve, reject) {
  resolve('Success!');
});
var extraData = 'ImExtraData';
promise1.then(function(value) {
  console.log(value, extraData);
  // expected output: "Success!" "ImExtraData"
}, extraData);


2
如果使用解构的数组或对象进行解析,以便显示多个参数,并且已经解析了详细的promise,则示例将更好:Promise.resolve([arg1,arg2,arg3]);
user5389726598465

1
我认为这是错误的,因为传递给的第二个参数是then用于处理reject函数的返回值的回调。而不是resolve('Success!');尝试reject('Error');我们将得到错误:Unhandled promise rejection在这里我们看到输出,因为它var extraData = 'ImExtraData';是一个全局变量,而不是因为使用它传递了它then
Shakiba Moshiri

如果您不通过它,那么您将无法访问它,因为它在promise中没有作用/如果您不通过它,则无法访问它。
sadiq

尝试删除它,看看它是否有效?codepen.io/k-five/pen/ZNOvKG在浏览器中查看控制台日志
Shakiba Moshiri,

非常感谢您的Codepen,但是请使用两个不同的变量,然后查看真正的因素!避免相同的变量。如果只是全局变量工作正常,我们就不需要传递额外的参数。
sadiq

0

您可以使用.bind()将param(this)传递给函数。

var someFunction =function(resolve, reject) {
  /* get username, password*/
  var username=this.username;
  var password=this.password;
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
}
var promise=new Promise(someFunction.bind({username:"your username",password:"your password"}));

我有这个函数,.then()当我在按钮` SaveImagesToFirebase =()=> {const uid = firebase.auth()。currentUser.uid; //提供者const {图片} = this.state; images.map(image => {let file = image.uri; console.log(file); const path =“ Img ” + Math.floor(Math.random()* 1500); console.log(“ @ IMAGE” ,path); const ref = firebase .storage().ref(provider/${uid}/ProviderGalary/${path}); ref.put(file);}); };`@gogog
DevAS

@DevAS <button onclick =“ then_function(SaveImagesToFirebase.bind(this))”> </ button>脚本是`var then_function = function(promise){new Promise(promise).then(function(e){/ * code * /})};函数SaveImagesToFirebase(resolve,reject){/ * code * / resolve(/ * ??? * /);}`
gogog
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.