首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用setTimeout和promises使这段JS代码更具功能性?

如何使用setTimeout和promises使这段JS代码更具功能性?
EN

Stack Overflow用户
提问于 2017-07-07 20:04:25
回答 1查看 171关注 0票数 0

我正在尝试学习如何使用更多的函数和更少的循环来编写代码,并且只是以一种更具功能性的方式。我想在调用connectBing之间实现一个超时。我想知道是否有可能不使用i变量,并且在迭代之间仍然获得1秒的超时。我的代码目前可以工作,但我正在寻找其他方法来编写它,而不是使用i。

这是我的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// MAIN
getAllPosts().then((posts) => {
    posts
        .forEach( (post, i) => {
            setTimeout(() => {
                connectBing(anchorText,console.log).then()
            } ,i * 1000)
        })

// CONNECT TO BING WITH KW AND DO SOMETHING
function connectBing(anchorText,doSomethingWithBing) {
    var deferred = q.defer();                                                                   
    request('https://www.cnn.com/search?q=' + anchorText, function (error, response, body) {    
        error ? console.log('error:', error) :                                                    
        console.log('statusCode:', response && response.statusCode);                              
        (doSomethingWithBing) ? doSomethingWithBing(body) : "You didn't give connectBing anything to do!"       
    })
    return deferred.promise                 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-07 21:44:56

您可以获取一个异步函数数组,并将每个函数链接在另一个函数之后运行。我将使用原生promises进行演示,您可以将其映射到您正在使用的库。

首先创建一个接受异步函数数组的函数。它将一个接一个地链接,返回最后一个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function chainAsyncFns(fns) {
    // Ensure we have at least one promise to return

    let promise = Promise.resolve();

    fns.forEach(fn => promise = promise.then(fn));

    return promise;
}

然后,对于每个post,创建一个异步函数,该函数将调用connectBing,然后等待超时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function connectBing() {
    // Pretend we are connecting to a data source

    return Promise.resolve();
}

function delay(ms) {
    // Return a promise that resolves when the timeout is up

    return new Promise(resolve => setTimeout(resolve, ms));
}

let fns = posts.map(post => () => {
    return connectBing()
        .then(() => delay(1000))
        .catch(() => console.log('error'));
});

将函数链接起来一个接一个地运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chainAsyncFns(fns).then(() => console.log('done'));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44978837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文