.then的返回值如何被函数return?

代码如下:

function item(args){
    var posttitle;
    let p = new Promise((resolve, reject) => {
        hexo.extend.filter.register('after_post_render',function(post){
            posttitle = post.title;
            resolve(posttitle);
            // 这里的post是文章的数据,而post.title则是文章的标题...
        });
    })

    p.then((value) => {
        console.log(value);
    })
    return value;
    //如何return .then的value值?
}

需要大家的帮助!~T-T...非常感谢!~

阅读 23k
6 个回答

Promise 中处理的是一个异步调用,异步调用是非阻塞式的,也就是说,你在调用的时候并不知道它什么时候结束,当然也就不会等到他返回一个有效数据之后再进行下一步处理。但是——

异步调用的内容是知道什么时候结束的,它结束之后可以发出通知。我们一般使用回调函数来获得这个通知,比如

function item(args, callback) {     // <-- 注意 callback 传入一个处理函数
    // ....
    p.then((value) => {
        console.log(value);
        callback(value);        // <-- 取得值之后通过回调进行下一步处理
    });
}

item(blabla,
    (value) => console.log(`got ${value}`)  // <-- 这就是上面提到的 callback
);

不过除非特殊情况,一般不应该把 Promise 处理成回调,而应该直接返回 Promise,以便后续进行基于 Promise 规范的处理,比如

function item(args) {       // <-- 它返回一个 Promise
    // ....
    return p.then((value) => {
        console.log(value);
        return value;
    });
}

// 继续按 Promise 规划在外面进行处理
item.then(value => console.log(`got ${value}`));

这样写起来似乎不是很符合常见的同步代码编写习惯,那可以用 async/await,具体参考阅读:

嗯,我想说的是不能直接在then里面用吗?


function item(){
    return new Promise(resolve => {
            resolve('aaaa')
        }
    )
}

item().then(value=> {
    console.log(value);
})

或者是你直接用个延时去取?

如果 Promise 执行的是异步函数,return 会先于 then 执行,所以不可能 return then 中的返回值。你可以传入回调函数,把值作为参数在 then 中调用回调函数:

function foo(cb) {
   ...
   p.then(v => cb(v))
}

或者可以使用 async/await 语法:

async function foo() {
    ...
    return await p
}

按照你这个代码的逻辑,完全可以直接将promise对象return出来啊,函数调用的时候不就可以拿到value值了

function item(args){
    var posttitle;
    let p = new Promise((resolve, reject) => {
        hexo.extend.filter.register('after_post_render',function(post){
            posttitle = post.title;
            resolve(posttitle);
            // 这里的post是文章的数据,而post.title则是文章的标题...
        });
    })

   return p
}

promise是异步的,你的需求是同步的,async/await能满足你

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题