js promise怎么返回值?

function fn1() {
    var promise = new Promise(function(resolve, reject) {
        // ... some code

        if ( /*异步操作成功*/ ) {
            resolve(value); //怎么将这个值作为fn1函数的返回值?
        } else {
            reject(error);
        }
    });

    return promise.then(function(value) {
        return value;  //这么写对吗?
    })
}

总的意思就是返回异步回调函数的返回值,如果使用promise不行,使用回调函数怎么能实现?

阅读 39.3k
评论
    9 个回答

    下面的方法可以获取 Promise 抛出的状态值。

    说明
    1.采用了ES7 语法 —— async await
    2.下述代码是在 React 中运行的,调用函数采用的this.funcName()
    3.获取 Promise 更常用的场景是在 Redux 中。在 action 中,返回 promise 状态值,在 container 组件中获取。

    fetchPromiseValue = () => {
        return new Promise(function(resolve, reject) {
            resolve({value: 'PromiseReturnValue'});   // Promise 抛出状态值
        })
    };
    
    handlePromise = async () =>{
        let  getValue  = await this.fetchPromiseValue();  // 异步获取 Promise  抛出的状态值
        console.log('Promise 的状态值: ',getValue.value);
    };
      • 169

      看了这么多,还是让我来回答一个正确答案吧,那就是

      promise 不能返回值

      只能返回promise,因为它是异步的,外部要用就得 fn1().then(value => console.log(value)) 的方式拿到

        • 326
        async function fn1() {
            var promise = new Promise(function(resolve, reject) {
                // ... some code
        
                if ( /*异步操作成功*/ ) {
                    resolve(value); //怎么将这个值作为fn1函数的返回值?
                } else {
                    reject(error);
                }
            });
        
            var value = await promise;
        }

          直接改成:

          function fn1() {
              return new Promise(function(resolve, reject) {
                  // ... some code
          
                  if ( /*异步操作成功*/ ) {
                      resolve(value)
                  } else {
                      reject(error);
                  }
              });
          }

          接着就可以:

          fn1().then(function(value){
              //do something
          })
            • 8.4k

            你这样返回的还是promise对象。

              • 2
              • 新人请关照
              首先需要确认的是Promise对象的状态不受外界影响,也就是说,Promise对象内部return外部是不能获取到的。

              所以我们要想获取Promise内部的值(也就是通过resolve(value)向下then传递的值),可以通过以下方法:

              方法一:看一个示例

              封装一个分页Promise:pageHelper.js

              const db = require('./db')
              
              module.exports.startPage = (currentPage, pageNumber, queryTable) => {
                return new Promise((resolve, reject) => {
                  db.query('SELECT COUNT(*) as count FROM ' + queryTable, (err, ret) => {
                    resolve(ret[0].count)
                  })
                }).then(value => {
                  return new Promise((resolve, reject) => {
                    db.query('SELECT * FROM ' + queryTable +' limit ?, ?', [currentPage - 1, pageNumber], (err, ret) => {
                      resolve({totalPage:value, resultdata: ret})
                    })
                  })
                })
              }

              可以在其他模块中这样拿到value:

              const express = require('express')
              const db = require('../utils/db')
              const pageHelper = require('../utils/pageHelper')
              const router = express.Router()
              
              router.get('/posts', (req, res, next) => {
                let currentPage = 2
                let pageNumber = 5
                pageHelper.startPage(currentPage, pageNumber, 'ali_article').then(value => {
                  res.render('admin/posts.html', {
                    pageResult: value
                  })
                })
              })

              方法二:

              使用callback回调,只是一种画蛇添足的做法,但能帮助理解Promise对象的特性

              function fn1(callback) {
                var promise = new Promise(function (resolve, reject) {
                  // ... some code
                  let value = 1;
                  if (true) {
                    resolve(value);
                  } else {
                    reject(error);
                  }
                }).then(value => {
                  callback(value)
                });
              }
              
              fn1(value => {
                console.log(value)
              });
                • 3
                • 新人请关照
                function fn1() {
                    var promise = new Promise(function(resolve, reject) {
                        // ... some code
                
                        if ( /*异步操作成功*/ ) {
                            resolve(value); //怎么将这个值作为fn1函数的返回值?
                        } else {
                            reject(error);
                        }
                    });
                
                    return promise.then(function(value) {
                        return new Promise(function(resolve,reject){
                            resolve value;
                        })
                    })
                }
                  return promise.then(function(value) {
                      return value;  //这么写对吗?
                  })

                  改为

                  promise.then(function(value) {
                      console.log(value);
                        return value;  //这么写对吗?
                    })

                  直接调用fn1即可

                    楼主最后怎么解决的 遇到了同样的问题

                    该答案已被忽略,原因:无意义的内容:赞、顶、同问等毫无意义的内容

                      撰写回答

                      登录后参与交流、获取后续更新提醒