Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用递归承诺合并排序_Javascript_Promise_Mergesort - Fatal编程技术网

Javascript 使用递归承诺合并排序

Javascript 使用递归承诺合并排序,javascript,promise,mergesort,Javascript,Promise,Mergesort,我试图在JS中实现一个基本的mergesort。我正在使用promises和flowtype。然而,当数组被拆分到长度小于2时,我当前的实现从未停止递归。有人能告诉我我做错了什么吗 let inputArr: Array<Number> = [1,2,8,3,2,10,9,7,5]; let mergesortAsync = function(input:Array<Number>) { "use strict"; return new Promise((reso

我试图在JS中实现一个基本的mergesort。我正在使用promises和flowtype。然而,当数组被拆分到长度小于2时,我当前的实现从未停止递归。有人能告诉我我做错了什么吗

let inputArr: Array<Number> = [1,2,8,3,2,10,9,7,5];
let mergesortAsync = function(input:Array<Number>) {
  "use strict";
  return new Promise((resolve,reject)=>{
    if(input.length <2 ){
      console.log('reached bottom, bottom: ',input);
      resolve(input);
    }
    var splitPoint:Number = parseInt(input.length/2);
    var left:Array<Number> = input.slice(0,splitPoint);
    var right:Array<Number> = input.slice(splitPoint,input.length);
    var sortedLeft:Array<Number>;
    var sortedRight:Array<Number>;

    mergesortAsync(left).then(sortLeftResult=>{
      sortedLeft = sortLeftResult;
      mergesortAsync(right).then(sortRightResult => {
        sortedRight = sortRightResult;
        console.log('sorted left: ',sortedLeft,' sorted right: ',sortedRight,' input: ',input, 'splitPoint: ',splitPoint);
        mergeAsync(input.slice(),sortedLeft,sortedRight).then(result => {
          resolve(result);
        });
      });
    });
  });
};
let mergeAsync = function(mergeInto: Array<Number>, left: Array<Number>, right: Array<Number>){
  return new Promise((resolve,reject)=>{
    "use strict";
    var mIndex:Number = 0;
    var lIndex:Number = 0;
    var rIndex:Number = 0;
    console.log('Merge start: mergeInto: ',mergeInto, ' left: ',left, ' right: ',right);
    for(mIndex=0; (lIndex< left.length && rIndex<right.length) ;mIndex++){
      if(left[mIndex]<=right[mIndex]){
        mergeInto[mIndex] = left[lIndex];
        lIndex++;
      } else{
        mergeInto[mIndex] = right[rIndex];
        rIndex++;
      }
      console.log('Looping - mIndex: ',mIndex,' rIndex: ',rIndex, ' lIndex: ',lIndex);
    }
    console.log('End Loop - mIndex: ',mIndex,' rIndex: ',rIndex, ' lIndex: ',lIndex);
    while(lIndex<left.length){
      mergeInto[mIndex] = left[lIndex];
      lIndex++;
      mIndex++;
    }
    while(rIndex<right.length){
      mergeInto[mIndex] = right[rIndex];
      rIndex++;
      mIndex++;
    }
    console.log('Merge complete: mergeInto: ',mergeInto, ' left: ',left, ' right: ',right);
    resolve(mergeInto);
  });
};

mergesortAsync(inputArr).then(results => console.log('Sorted result: ',JSON.stringify(result)))
.catch(error => console.log('Error: ',error));
let-inputArr:Array=[1,2,8,3,2,10,9,7,5];
让mergesortAsync=函数(输入:数组){
“严格使用”;
返回新承诺((解决、拒绝)=>{
如果(输入长度{
sortedLeft=sortLeftResult;
合并SortAsync(右)。然后(sortRightResult=>{
SortDright=SortTrightResult;
log('sorted left:'、sortedLeft、'sortedLeft:'、sortedRight:'、input:'、input、'splitPoint:'、splitPoint);
mergeAsync(input.slice()、sortedLeft、sortedRight)。然后(结果=>{
决心(结果);
});
});
});
});
};
让mergeAsync=函数(mergeInto:Array,left:Array,right:Array){
返回新承诺((解决、拒绝)=>{
“严格使用”;
var mIndex:Number=0;
var lIndex:数值=0;
变量rIndex:Number=0;
log('Merge start:mergeInto:',mergeInto,'left:',left,'right:',right);
对于(mIndex=0;(lIndex
是-因为
resolve
不是
return
,所以它不会停止函数的执行。请使用

if (input.length < 2) {
    …
} else {
    …
}
if(input.length<2){
…
}否则{
…
}

if(input.length<2){
…
返回;
}
…

避免!你到底在使用承诺吗?你的代码中没有异步的东西。你有同步的例子吗?网上有很多mergesort的例子。或者干脆把承诺从你的代码中去掉,它应该仍然有效。
if (input.length < 2) {
    …
    return;
}
…