【问题标题】:How to pass parameter to a promise function如何将参数传递给promise函数
【发布时间】:2016-05-20 23:54:22
【问题描述】:

这似乎是一个愚蠢的问题,但我是这个主题的新手。我正在研究节点 js 的承诺。我想将参数传递给一个承诺函数。但是我想不通。

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

【问题讨论】:

  • 没有理由这样做,你可以在更高的范围内定义usernamepassword
  • 但我是从另一个模块调用承诺,而且用户名和密码也不是静态的,而是来自客户端。定义一个函数设置而另一个函数使用的某种全局变量是否安全。是否存在变量被其他客户端更改的风险?
  • @kundante 你不需要任何全局变量。了解闭包。
  • @adeneo 承诺是异步的 - 如果他在第一个承诺解决之前第二次调用该函数怎么办?
  • @adeneo - 请不要回答“没有理由这样做”的问题。你不知道,这是一个非常烦人的反应。这个人可能有特定的原因,为什么他想以他不一定觉得相关的特定方式来做某事。要么可以,要么不能,如果这是一个坏主意,你可以列出原因。显然,正如下面 248 票赞成的答案所表明的那样,这是可以做到的,而且有很多理由这样做。

标签: javascript node.js promise parameter-passing es6-promise


【解决方案1】:

我知道这是旧的,但这可能有助于有人通过谷歌挖掘。这是一个更实际的示例,我只需将 2 个参数传递给 promise 函数并等待它解析。希望这会有所帮助。 setTimeout 模拟“处理时间”。 3 秒后,该值将从 Promise 中返回并打印到屏幕上。

const addNumbers = (a, b) => {
    
  return new Promise((resolve, reject) => {
    
    setTimeout(() => {
      resolve(a + b);
    }, 3000);
  
  });
  
  
};

let getResult = async (a, b) => {
    let value = await addNumbers(a, b);
    console.log(value);
};

getResult(1, 3);

【讨论】:

    【解决方案2】:

    您可以在带有参数的函数中返回您的承诺。像这样:

    function someFunction(username, password) {
          return new Promise((resolve, reject) => {
            // Do something with the params username and password...
            if ( /* everything turned out fine */ ) {
              resolve("Stuff worked!");
            } else {
              reject(Error("It didn't work!"));
            }
          });
        }
        
        someFunction(username, password)
          .then((result) => {
            // Do something...
          })
          .catch((err) => {
            // Handle the error...
          });
    

    【讨论】:

    • 嗨 Jermine,最好在您的答案中添加一些描述。
    【解决方案3】:

    我用这个..

    let verifyEmail = (email) => new Promise((resolve, rejected) => {
        let rsp = {isRepeated:false}
        let sql = `select id from users where email='${email}' `
        try{
            db.query(sql, (err,result)=>{
                if(!err){
                    if(result.length > 0){
                        rsp = {isRepeated:true}
                    }
                }
            })
            resolve(rsp)
        }catch(e){
            rejected({ok:false,err:e})
        }
    })
    

    【讨论】:

      【解决方案4】:

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

      var some_function = 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"));
        }
       });
      }
      

      然后,使用它:

      some_module.some_function(username, password).then(function(uid)
      {
       // stuff
      })
      

       

      ES6:

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

      用途:

      some_module.some_function(username, password).then(uid =>
      {
       // stuff
      });
      

      【讨论】:

      • 什么是someModule
      • 这只是OP中的一个例子
      • @Shanoor uid 是什么?是字符串“Stuff working!”吗?
      • @OldGeezer,它只是一个变量来保存承诺的回报。在这种情况下,是的,那将是“Stuff working!”。
      • 你知道如何在新的promise中调用父类的函数吗?
      【解决方案5】:

      更短

      var foo = (user, pass) =>
        new Promise((resolve, reject) => {
          if (/* condition */) {
            resolve("Fine");
          } else {
            reject("Error message");
          }
        });
      
      foo(user, pass).then(result => {
        /* process */
      });
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 如果您使用解构的数组或对象进行解析,那么您的示例会更好,因此会显示多个参数,并且创建的详细承诺已经像这样解析: Promise.resolve([arg1, arg2, arg3 ]);
        • 我认为这是错误的,因为传递给then 的第二个参数是处理reject 函数返回值的回调。而不是resolve('Success!'); 尝试reject('Error'); 我们将得到错误:Unhandled promise rejection 这里我们看到输出因为var extraData = 'ImExtraData'; 是一个全局 变量,而不是因为使用then传递它>
        • 如果你不通过它你不能访问它,因为它在promise中没有范围/那么如果你不通过它。
        • 尝试删除它,看看它是否有效? codepen.io/k-five/pen/ZNOvKG 在浏览器中查看控制台日志
        • 我很欣赏你的 codepen,但使用两个不同的变量,然后看看真正的因素!避免使用相同的变量。如果只是全局变量工作正常,我们不需要传递额外的参数。
        【解决方案7】:

        您可以使用 .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.用户界面; // 提供者 const { images } = this.state; images.map(image => { let file = image.uri; console.log(file); const path = "Img" + Math.floor(Math.random() * 1500); console.log( "@IMAGE", 路径); const ref = firebase .storage() .ref(provider/${uid}/ProviderGalary/${path}); ref.put(file); }); };` @gogog
        • @DevAS 脚本是` var then_function=function(promise){new Promise(promise).then(function (e){/*代码*/})}; function SaveImagesToFirebase(resolve,reject){/*code*/resolve(/*???*/);}`
        • 正是我想要的:分离我的函数,这样你就不需要在你的承诺中包装匿名函数function f2(resolve, reject){ console.log('executing with params : ', this); setTimeout(() => resolve("done!"), this.delay) }; async function f1(data) { // process data here console.log('before'); let promise = new Promise(f2.bind(data)); let result = await promise; // wait until the promise resolves console.log('after'); // process result here alert(result); // "done!" } const data = {delay: 1000}; f1(data);
        猜你喜欢
        • 2016-11-18
        • 2017-06-10
        • 2015-10-30
        • 1970-01-01
        • 2018-03-28
        • 2013-01-27
        • 2021-08-15
        • 2016-11-17
        相关资源
        最近更新 更多