Asynchronous 带有承诺的递归调用async func可能会得到未处理的承诺拒绝

Asynchronous 带有承诺的递归调用async func可能会得到未处理的承诺拒绝,asynchronous,recursion,fetch,es6-promise,Asynchronous,Recursion,Fetch,Es6 Promise,调用getAllStuff抛出: 可能的未处理承诺拒绝(id:0): TypeError:无法读取未定义的属性“then” TypeError:无法读取未定义的属性“then” 在getAllStuff 我想这通常是因为我没有从承诺或其他事情中返回,但我在哪里没有呢?我一直在使用JavaScript或展开,我想我可能会使用您的程序作为上下文与您共享它们,以便在JavaScript中学习它们 const getAllStuff=async(initUrl='/0')=> 异步展开 (异步(下一步、

调用getAllStuff抛出:

可能的未处理承诺拒绝(id:0): TypeError:无法读取未定义的属性“then” TypeError:无法读取未定义的属性“then” 在getAllStuff

我想这通常是因为我没有从承诺或其他事情中返回,但我在哪里没有呢?

我一直在使用JavaScript或
展开
,我想我可能会使用您的程序作为上下文与您共享它们,以便在JavaScript中学习它们

const getAllStuff=async(initUrl='/0')=>
异步展开
(异步(下一步、完成、填充)=>
下一步
?下一步(填充,等待获取(填充,下一步))
:完成(东西)
,等待获取(initUrl)
)
const get=async(url='')=>
fetch(url).then(res=>res.json())
为了证明这一点,我们引入了伪
获取
和数据库
DB
,每个请求的伪
延迟

const fetch=(url=“”)=>
Promise.resolve({json:()=>DB[url]})。然后(延迟)
常数延迟=(x,ms=250)=>
新承诺(r=>setTimeout(r,ms,x))
常数DB=
{'/0':{a:1,下一个:'/1'}
,'/1':{b:2,下一个:'/2'}
,'/2':{c:3,d:4,下一个:'/3'}
,“/3”:{e:5}
}
现在我们就这样运行我们的程序

getAllStuff().then(console.log,console.error)
//[{a:1,下一个:'/1'}
//,{b:2,下一个:'/2'}
//,{c:3,d:4,下一个:'/3'}
//,{e:5}
// ]
最后,这里是
asyncUnfold

const asyncUnfold=async(f,init)=>
f(异步(x,acc)=>[x,…等待异步展开(f,acc)]
,异步(x)=>[x]
,init
)
程序演示1

const asyncUnfold=async(f,init)=>
f(异步(x,acc)=>[x,…等待异步展开(f,acc)]
,异步(x)=>[x]
,init
)
const getAllStuff=async(initUrl='/0')=>
异步展开
(异步(下一步、完成、填充)=>
下一步
?下一步(填充,等待获取(填充,下一步))
:完成(东西)
,等待获取(initUrl)
)
const get=async(url='')=>
fetch(url).then(res=>res.json())
常量获取=(url=“”)=>
Promise.resolve({json:()=>DB[url]})。然后(延迟)
常数延迟=(x,ms=250)=>
新承诺(r=>setTimeout(r,ms,x))
常数DB=
{'/0':{a:1,下一个:'/1'}
,'/1':{b:2,下一个:'/2'}
,'/2':{c:3,d:4,下一个:'/3'}
,“/3”:{e:5}
}
getAllStuff().then(console.log,console.error)
//[{a:1,下一个:'/1'}
//,{b:2,下一个:'/2'}
//,{c:3,d:4,下一个:'/3'}
//,{e:5}
//]
我一直在使用JavaScript或
展开
,我想我可以将它们与您分享,使用您的程序作为学习它们的上下文

const getAllStuff=async(initUrl='/0')=>
异步展开
(异步(下一步、完成、填充)=>
下一步
?下一步(填充,等待获取(填充,下一步))
:完成(东西)
,等待获取(initUrl)
)
const get=async(url='')=>
fetch(url).then(res=>res.json())
为了证明这一点,我们引入了伪
获取
和数据库
DB
,每个请求的伪
延迟

const fetch=(url=“”)=>
Promise.resolve({json:()=>DB[url]})。然后(延迟)
常数延迟=(x,ms=250)=>
新承诺(r=>setTimeout(r,ms,x))
常数DB=
{'/0':{a:1,下一个:'/1'}
,'/1':{b:2,下一个:'/2'}
,'/2':{c:3,d:4,下一个:'/3'}
,“/3”:{e:5}
}
现在我们就这样运行我们的程序

getAllStuff().then(console.log,console.error)
//[{a:1,下一个:'/1'}
//,{b:2,下一个:'/2'}
//,{c:3,d:4,下一个:'/3'}
//,{e:5}
// ]
最后,这里是
asyncUnfold

const asyncUnfold=async(f,init)=>
f(异步(x,acc)=>[x,…等待异步展开(f,acc)]
,异步(x)=>[x]
,init
)
程序演示1

const asyncUnfold=async(f,init)=>
f(异步(x,acc)=>[x,…等待异步展开(f,acc)]
,异步(x)=>[x]
,init
)
const getAllStuff=async(initUrl='/0')=>
异步展开
(异步(下一步、完成、填充)=>
下一步
?下一步(填充,等待获取(填充,下一步))
:完成(东西)
,等待获取(initUrl)
)
const get=async(url='')=>
fetch(url).then(res=>res.json())
常量获取=(url=“”)=>
Promise.resolve({json:()=>DB[url]})。然后(延迟)
常数延迟=(x,ms=250)=>
新承诺(r=>setTimeout(r,ms,x))
常数DB=
{'/0':{a:1,下一个:'/1'}
,'/1':{b:2,下一个:'/2'}
,'/2':{c:3,d:4,下一个:'/3'}
,“/3”:{e:5}
}
getAllStuff().then(console.log,console.error)
//[{a:1,下一个:'/1'}
//,{b:2,下一个:'/2'}
//,{c:3,d:4,下一个:'/3'}
//,{e:5}
//]
const PAGESIZE = 1000;
const DEFAULTLINK = `${URL}/stuff?pageSize=${PAGESIZE}&apiKey=${APIKEY}`;

export const getAllStuff = (initialLink = DEFAULTLINK) => {
  let allStuff = {};
  return getSuffPage(initialLink)
    .then(stuff => {
      allStuff = stuff;
      if (stuff.next) {
        return getAllStuff(stuff.next)
          .then(nextStuff => {
            allStuff = Object.assign({}, stuff, nextStuff);
            return allStuff;
          });
      } else {
        return allStuff;
      }
    });
};

const getSuffPage = nextPageLink => {
  fetch(nextPageLink).then(res => {
    return res.json();
  });
};