如何向javascript中的函数添加回调,该函数在一行中使用不同的参数调用了两次?

如何向javascript中的函数添加回调,该函数在一行中使用不同的参数调用了两次?,javascript,callback,webix,Javascript,Callback,Webix,我有一个使用不同参数调用两次的函数: 函数setArray(chartType、charData、nodeName、meaQuantityId、unitName){ var legendText=nodeName+'('+unitName+'); var lineData=null; var scatterData=null; if(chartType!=null){ 开关(图表型){ 案例“行”: { 如果(compareGraphData.length>0){ 对于(var i=0;i0)

我有一个使用不同参数调用两次的函数:

函数setArray(chartType、charData、nodeName、meaQuantityId、unitName){
var legendText=nodeName+'('+unitName+');
var lineData=null;
var scatterData=null;
if(chartType!=null){
开关(图表型){
案例“行”:
{
如果(compareGraphData.length>0){
对于(var i=0;i0){
对于(var i=0;i});您可以像这样将函数传递给您的函数:

function setArray(chartType, data, cb){
 cb("hello")
} 

setArray('scatter', data, function(x){
 console.log(x) // hello
});
双重的

function setArray(chartType, data, cb){
 cb(data)
} 

setArray('scatter', "Hello ", function(x){
 setArray('scatter', "World!", function(y){
    console.log(x + y)// Hello world!
 })
});

或者在异步执行的情况下使用

(由于缺少setArray函数体,这一点不清楚),这可以通过一个承诺来解决。此处参考:

let setArray=函数setArray('line',data){
返回新承诺((解决、拒绝)=>{
//这里是函数setArray的逻辑
});
};
让call1=setArray('行',数据)。然后(函数(结果){
//用结果做事
});
让call2=setArray('scatter',data)。然后(函数(结果){
//用结果做事

});我认为您想要的是只使用最后一次更改

例如,用户有一个所有动物的列表,可以选择只显示慢速或快速动物,但过滤器是异步的

用户单击仅显示慢速动物,过滤器返回数据需要1秒时间。在这一秒钟内,用户选择显示所有动物,因此用户界面设置为显示所有动物。显示全部需要100毫秒,返回并更新列表以显示全部。然后慢动物列表出现了,列表只显示慢动物

现在,用户界面和显示的列表不同步。描述了这个问题

我实现的这个问题的一个解决方法是将承诺传递给一个函数,该函数只有在上次创建的承诺(最近的用户操作)是时才会解决该承诺

可以找到如何将使用回调的函数转换为返回承诺的函数(在:将回调转换为承诺下)

[更新]

如昨天所述;我认为用户更改了一些内容,然后又更改了其他内容,因此2个承诺获得的数据无法在用户创建它们的同时解析和/或同时解析,因此您的应用程序正在执行不再需要的操作

我昨天给出的答案可以使用from lib通过以下方式应用于您的代码:

const onlyLastRequestedPromise = ((promiseIds) => {
  const whenResolve = (promise, id, promiseID, resolveValue) => {
    if(promise!==undefined){//called by user adding a promise
      promiseIds[id]={};
    } else {//called because promise is resolved
      return (promiseID === promiseIds[id])
        ? Promise.resolve(resolveValue)
        : Promise.reject("A newer request was made.")
    }
    return (function (currentPromiseID) {
      return promise
        .then(function (result) {
          return whenResolve(undefined,id, currentPromiseID, result);
        });
    }(promiseIds[id]));
  };
  return (id = "general") => promise =>
    whenResolve(promise, id);
})({});
//this is for your fetching your data, add it to your service
const lastForChart=onlyLastRequestedPromise("CHART_DATA");

//wrap your getGraphData in a "only last"
lastForChart(DBService.getGraphData('getGraphData'))
.then(
  function(response){
    var charData=response.result;
    setArray('line', charData, nodeName, meaQuantityId, unitName);
    setArray('line', charData, nodeName, meaQuantityId, unitName);
})
.catch(
  err=>
    (err==="A newer request was made.")
      ? "replaced by newer request"
      : Promise.reject(err)
);

你什么意思
因为javascript是异步的
javascript是同步的,除非您将其设置为“因为javascript是异步的”——否则它不是。JS可以访问的外部API。如何与它们交互以确定它们何时完成取决于API。您还没有告诉我们您正在与什么API交互。请查看承诺。。。将一些实际工作的代码放在那里,以演示您的挑战,也许我们可以帮助您解决这些问题。@Markschultheis我已经更新了帖子,并根据您的要求放置了实际代码。我认为这只是问题的一部分,用户可能会在promise 1解决问题时改变主意,从而创建promise 2。当承诺2在承诺1之前解析,并且您只是根据解析值盲目更新ui时,ui将显示承诺2的结果,然后显示承诺1的结果。用户现在看到的是