簡體   English   中英

使用q框架對多個GET請求進行Node.js遞歸調用

[英]Node.js recursive calls with q framework for multiple GET requests

在搜索stackoverflow和Q文檔后,不幸的是我仍然不了解q.ninvoke函數。 我想知道是否有人可以向我解釋它如何與我的方案一起工作:

我正在獲取fetchXml請求的結果,該請求最多返回5000個條目。 我想實現一種方法(通過一條鏈)進行自我調用,直到服務器不再響應頁面調度cookie為止。

最后,所有結果都應在遞歸中歸並到遞歸的頂部...

var tryReexecuteForNext5000Entries = function(entitySetName, fetchXml, args){
    var deferred = q.defer();
    var response = args[0];    
    var jsonBody = args[1];
    var fetchXmlPagingCookieResponse = jsonBody["@Microsoft.Dynamics.CRM.fetchxmlpagingcookie"];

    if(!fetchXmlPagingCookieResponse){        
        deferred.resolve(args);
        return deferred.promise;
    }

    var pagingArgs = getPagingArgs(fetchXmlPagingCookieResponse);
    var pageNumber = pagingArgs[0];
    var pagingCookie = transformCookieForFetch(pagingArgs[1]);
    fetchXml = injectPagingArgsIntoFetchXml(fetchXml, pageNumber, pagingCookie);


    getWithFetchXml(entitySetName, fetchXml)        //recursion!
         .done(function(bodyValue){
             args[1].value = args[1].value.concat(jsonBody.value).concat(bodyValue);
             deferred.resolve(args);
        }
        .fail(function(error){
            deferred.reject(error);
        }));

    return deferred.promise;
}

function getWithFetchXml(entitySetName, fetchXml){
    return AuthProvider.retrieveToken()
        .then(createFetchOptions.bind(this, entitySetName, fetchXml))
        .then(addProxyToOptions)
        .then(executeRequest)
        .then(checkResponse)
        .then(tryReexecuteForNext5000Entries.bind(this, entitySetName, fetchXml))
        .then(onRequestSucceeded.bind(this, "successfully GET fetchXml against CRM"))
        .fail(onFail.bind(this, "webApiRequest.getWithFetchXml: failed to GET with fetchXml: \r\n"+fetchXml));
}

使用此設置Q會拋出“ TypeError:無法讀取未定義的屬性'apply'”

應該如下工作:

  • 調用getWithFetchXml
  • 檢索JsonObject List1和分頁令牌AND
  • ===呼叫getWithFechXml²
  • ===檢索JsonObject List2和pageingToken AND
  • ======調用getWithFetchXml³
  • ======檢索沒有分頁令牌的JsonObject List3
  • ======返回列表
  • ===將List3追加到List2並返回
  • 將List2附加到List1並返回

這是一個愚蠢的語法錯誤...抱歉,開發JavaScript時,我沒有設置VisualStuidoCode以獲得良好的反饋。

問題是:

getWithFetchXml(entitySetName, fetchXml)        //recursion!
        .done(function(bodyValue){
             args[1].value = jsonBody.value.concat(bodyValue);
             deferred.resolve(args);
        }
        .fail(function(error){
            deferred.reject(error);
        }));

錯誤的支架! 應該:

getWithFetchXml(entitySetName, fetchXml)        //recursion!
            .then(function(bodyValue){
                 args[1].value = jsonBody.value.concat(bodyValue);
                 deferred.resolve(args);
            })
            .fail(function(error){
                deferred.reject(error);
            });

這是我在Node.js中遞歸JavaScript的運行代碼:

function getWithFetchXml(entitySetName, fetchXml){
    return getWithFetchXmlRecursive(entitySetName, fetchXml, null);
}

var getWithFetchXmlRecursive = function(entitySetName, fetchXml, page){
    return AuthProvider.retrieveToken()
        (...)
        .then(tryReexecuteForNext5000Entries.bind(this, entitySetName, fetchXml, page))
        .then(onRequestSucceeded.bind(this, "successfully GET fetchXml against CRM"))
        .fail(onFail.bind(this, "webApiRequest.getWithFetchXml: failed to GET with fetchXml: \r\n"+fetchXml));
}

var tryReexecuteForNext5000Entries = function(entitySetName, fetchXml, page, args){
    (...)
    var fetchXmlPagingCookieResponse = jsonBody["@Microsoft.Dynamics.CRM.fetchxmlpagingcookie"];        
    var onRecursionSucceeded = function(bodyValue){
        args[1].value = jsonBody.value.concat(bodyValue);
        deferred.resolve(args);
    }
    var onRecursionFailed = function(error){deferred.reject(error);};

    if(!fetchXmlPagingCookieResponse){        
        deferred.resolve(args);
        return deferred.promise;
    }
    (...)
    console.log("webApiRequest.tryReexecuteForNext5000Entries: there is more! starting recursive request with depth: " + (page-1));
    getWithFetchXmlRecursive(entitySetName, fetchXml, ++page)        //recursion!
        .then(onRecursionSucceeded)
        .fail(onRecursionFailed);

    return deferred.promise;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM