te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>javascript - How to use Promise.all() on array of promises which take parameters? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to use Promise.all() on array of promises which take parameters? - Stack Overflow

programmeradmin4浏览0评论
let locArr = [{ x: 0, y: 0 }, { x: 2, y: 4 }, { x: 6, y: 8 }];

// my asynchronous function that returns a promise
function findLoc(x, y) {
    return new Promise((resolve, reject) => {
        let a = setTimeout(() => {
            resolve({ x: x * x, y: y * y });
        }, 500);
    });
}

Promise.all([
    // my problem is below
    findLoc(locArr[0].x, locArr[0].y),
    findLoc(locArr[1].x, locArr[1].y),
    findLoc(locArr[2].x, locArr[2].y),
]).then(values => {
    // all values from all the promises
});

How can I write the Promise.all() function to take parameters from an array of varying size?

I want to pass arguments to the array of promises accepted in the .all() method of the Promise class. What is the best way to do that?

let locArr = [{ x: 0, y: 0 }, { x: 2, y: 4 }, { x: 6, y: 8 }];

// my asynchronous function that returns a promise
function findLoc(x, y) {
    return new Promise((resolve, reject) => {
        let a = setTimeout(() => {
            resolve({ x: x * x, y: y * y });
        }, 500);
    });
}

Promise.all([
    // my problem is below
    findLoc(locArr[0].x, locArr[0].y),
    findLoc(locArr[1].x, locArr[1].y),
    findLoc(locArr[2].x, locArr[2].y),
]).then(values => {
    // all values from all the promises
});

How can I write the Promise.all() function to take parameters from an array of varying size?

I want to pass arguments to the array of promises accepted in the .all() method of the Promise class. What is the best way to do that?

Share Improve this question edited Jan 14, 2019 at 8:46 user10041268 asked Apr 10, 2018 at 3:11 EmmanuelEmmanuel 10.9k1 gold badge35 silver badges39 bronze badges 6
  • 1 This code looks OK at a glance, what's the issue? – Andy Ray Commented Apr 10, 2018 at 3:15
  • 2 you should create array const x = locArr.map(a => findLoc(a.x, a.y)) and pass x inside Promise.all – indapublic Commented Apr 10, 2018 at 3:16
  • @andy I don't want to hardcode the array values that are passed into the promises – Emmanuel Commented Apr 10, 2018 at 3:16
  • @indapublic could you explain that a bit more? – Emmanuel Commented Apr 10, 2018 at 3:19
  • 1 @EmmanuelNK Try this Promise.all(locArr.map(a => findLoc(a.x, a.y))).then(values => { console.log(values); }); – indapublic Commented Apr 10, 2018 at 3:21
 |  Show 1 more ment

4 Answers 4

Reset to default 10

use map instead

let locArr = [{
  x: 0,
  y: 0
}, {
  x: 2,
  y: 4
}, {
  x: 6,
  y: 8
}];

// my asynchronous function that returns a promise
function findLoc(x, y) {
  return new Promise((resolve, reject) => {
    let a = setTimeout(() => {
      resolve({
        x: x * x,
        y: y * y
      });
    }, 500);
  });
}

Promise.all(
  locArr.map(o => findLoc(o.x, o.y))
).then(values => {
  // all values from all the promises
  console.log(values)
});

You can use map:

let locArr = [{ x: 0, y: 0 }, { x: 2, y: 4 }, { x: 6, y: 8 }];

// my asynchronous function that returns a promise
function findLoc(x, y) {
    return new Promise((resolve, reject) => {
        let a = setTimeout(() => {
            resolve({ x: x * x, y: y * y });
        }, 500);
    });
}

Promise.all(
  locArr.map(//map location to promise
    location=>findLoc(location.x,location.y)
  )
).then(values => {
    // all values from all the promises
});

This is a trick that requires to modify a little the input of findLoc:

let locArr = [{ x: 0, y: 0 }, { x: 2, y: 4 }, { x: 6, y: 8 }];

// my asynchronous function that returns a promise
// 
function findLoc({x, y}) {
    return new Promise((resolve, reject) => {
        let a = setTimeout(() => {
            resolve({ x: x * x, y: y * y });
        }, 500);
    });
}

Promise.all(locArr.map(findLoc)).then(values => {
    console.log(values);
});

Use map, like others said, but also adjust the findLoc() function for the simplest reading:

let locArr = [{ x: 0, y: 0 }, { x: 2, y: 4 }, { x: 6, y: 8 }];

// my asynchronous function that returns a promise
function findLoc(coordinates) {
    return new Promise((resolve, reject) => {
        let a = setTimeout(() => {
            resolve({ 
              x: coordinates.x * coordinates.x, 
              y: coordinates.y * coordinates.y 
            });
        }, 500);
    });
}

Promise
    .all(locArr.map(findLoc))
    .then(values => {
        console.log(JSON.stringify(values, false, 2));
    });

发布评论

评论列表(0)

  1. 暂无评论