Javascript 传入setTimeOut函数的多个参数引发未捕获的引用错误:未定义方法(匿名函数)?

Javascript 传入setTimeOut函数的多个参数引发未捕获的引用错误:未定义方法(匿名函数)?,javascript,ibm-mobilefirst,settimeout,Javascript,Ibm Mobilefirst,Settimeout,我有一个函数a,它调用函数Bx,y;它又叫Cp,q A->Bx,y->CP,q B处理JSONStore以提取与函数C相关的数据,在JSONStore数据提取结束之前,脚本调用func Cp,q,所以为了避免它,我使用了setTimeOut,延迟1秒 function B(x,y) { if(p===undefined || q===undefined) { setTimeout(function() { C(p,q); }, 1

我有一个函数a,它调用函数Bx,y;它又叫Cp,q

A->Bx,y->CP,q

B处理JSONStore以提取与函数C相关的数据,在JSONStore数据提取结束之前,脚本调用func Cp,q,所以为了避免它,我使用了setTimeOut,延迟1秒

function B(x,y) {
    if(p===undefined || q===undefined) {
        setTimeout(function() {
            C(p,q); 
        }, 1000);
    }    
}
但我得到的错误是未捕获引用错误:方法未定义M979:192 C VM979:192匿名函数

我读过很多与setTimeOut相关的博客,发现了这种方法

我的代码:

function Submit_Data() {    
    var ChatWindow_Height = 650;
    var ChatWindow_Width = 570;

    window.open("Live Chat", "chat", "height=" + ChatWindow_Height + ", width = " + ChatWindow_Width);

    post("https://xyz/abc/StartChat.aspx", "post");
}

var regUserName,regUserMobile;

function post(path, method) {
    method = method || "post"; // Set method to post by default if not specified.

    var collectionName = 'Registration';
    var JSONStoreCollections = {};
    JSONStoreCollections[collectionName] = {};
    JSONStoreCollections[collectionName].searchFields = {uName: 'string'};

    WL.JSONStore.init(JSONStoreCollections)
    .then(function () {
        WL.JSONStore.get(collectionName).findAll().then(function (res) {    
            WL.Logger.info('Registration retrived is :', res);
            console.log(JSON.stringify(res));

            console.log(res[0].json.userName+"  "+res[0].json.userMobile+" "+res[0].json.userPass+" "+res[0].json.userRePass);

            regUserName=res[0].json.userName;
            regUserMobile=res[0].json.userPass;

            console.log("For Chat Data 1 is "+regUserName+"  "+regUserMobile);
        })
        .fail(function (err) {
            WL.Logger.error("Failed authentication "+err);
        });
    })
    .fail(function (err) {
        alert("Error is "+err);
    });
    if(regUserName===undefined || regUserMobile===undefined) {
        setTimeout(function()   {
            openChat(regUserName,regUserName); // Error Here
        }, 1000);
    }
}

function openChat(regUserName,regUserName) {
    // The rest of this code assumes you are not using a library.
    // It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);
    form.setAttribute("target", "chat");

    var hiddenField1 = document.createElement("input");
    var hiddenField2 = document.createElement("input");
    var hiddenField3 = document.createElement("input"); 

    console.log("For Chat Data 3 is "+regUserName+"  "+regUserMobile);

    hiddenField1.setAttribute("type", "hidden");
    hiddenField1.setAttribute("id", "vName");
    hiddenField1.setAttribute("name", "vName");
    hiddenField1.setAttribute("value", regUserName);

    hiddenField2.setAttribute("type", "hidden");
    hiddenField2.setAttribute("id", "mobile");
    hiddenField2.setAttribute("name", "21512");
    hiddenField2.setAttribute("value", regUserMobile);

    hiddenField3.setAttribute("type", "hidden");
    hiddenField3.setAttribute("id", "state");
    hiddenField3.setAttribute("name", "21524");
    hiddenField3.setAttribute("value", "25");

    document.body.appendChild(form);
    form.submit();
}

这些行的位置不合逻辑:

if(regUserName===undefined || regUserMobile===undefined) {
    setTimeout(function()   {
        openChat(regUserName,regUserName); // Error Here
    }, 1000);
}
只需在JSONStore.get回调中调用openChat:

    regUserMobile=res[0].json.userPass;
    console.log("For Chat Data 1 is "+regUserName+"  "+regUserMobile);

    if(regUserName===undefined || regUserMobile===undefined) {
        openChat(regUserName,regUserName);
    }
})

您可能还希望将===替换为!==,那里我想这是为了检查参数是否已填充。

我厌倦了这件作品,它工作正常:

function A() {
    B(1, 2)
}

function B(x,y) {
    if(true) {
        setTimeout(function() {
            C(3,4); 
        }, 1000);
    }    
}

function C(p,q) {
    alert('in c')
}

A()

我尝试了你的代码,我得到了与你提到的相同的错误,我已经修改了代码,现在它使用这些代码只是根据你想要的修改URL链接

function Submit_Data()
{   
    var ChatWindow_Height = 650;
    var ChatWindow_Width = 570;
    window.open("VodaFone Live Chat", "chat", "height=" + ChatWindow_Height + ", width = " + ChatWindow_Width);
    post("https://xyz/abc/StartChat.aspx", "post");
}

var regUserName,regUserMobile;
function post(path, method) {
    method = method || "post"; // Set method to post by default if not specified.

    // The rest of this code assumes you are not using a library.
    // It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);
    form.setAttribute("target", "chat");

    var hiddenField1 = document.createElement("input");
    var hiddenField2 = document.createElement("input");
    var hiddenField3 = document.createElement("input"); 

    var collectionName = 'Registration';
    var JSONStoreCollections = {};
    JSONStoreCollections[collectionName] = {};
    JSONStoreCollections[collectionName].searchFields = {uName: 'string'};
    WL.JSONStore.init(JSONStoreCollections) 

    .then(function () 
            {
        WL.JSONStore.get(collectionName).findAll().then(function (res) 
                {   
            WL.Logger.info('Registration retrived is :', res);
            console.log(JSON.stringify(res));

            console.log(res[0].json.userName+"  "+res[0].json.userMobile+" "+res[0].json.userPass+" "+res[0].json.userRePass);

            regUserName=res[0].json.userName;
            regUserMobile=res[0].json.userMobile;

            hiddenField1.setAttribute("type", "hidden");
            hiddenField1.setAttribute("id", "vName");
            hiddenField1.setAttribute("name", "vName");
            hiddenField1.setAttribute("value", regUserName);

            hiddenField2.setAttribute("type", "hidden");
            hiddenField2.setAttribute("id", "mobile");
            hiddenField2.setAttribute("name", "21512");
            hiddenField2.setAttribute("value", regUserMobile);

            hiddenField3.setAttribute("type", "hidden");
            hiddenField3.setAttribute("id", "state");
            hiddenField3.setAttribute("name", "21524");
            hiddenField3.setAttribute("value", "25");


            console.log("For Chat Data 1 is "+regUserName+"  "+regUserMobile);

                })
                .fail(function (err) 
                        {
                    WL.Logger.error("Failed authentication "+err);
                        });
            })
            .fail(function (err) 
                    {
                alert("Error is "+err);
                    });

    if(regUserName===undefined || regUserMobile===undefined)
    {
        setTimeout(function()   {
            form.appendChild(hiddenField1);
            form.appendChild(hiddenField2);
            form.appendChild(hiddenField3);

            document.body.appendChild(form);
            form.submit();

                }, 1000);
    }
}

我知道这是不同的方式,可能不可取,但我就是这样修复的。

为什么要使用setTimeout而不是回调函数?嗯,看起来openChat应该在范围内。但是,我不明白为什么使用setTimeout而不是将调用放在JSONstore回调中?是的,我应该将openChat放在JSONstore回调中。实际上,这是我做的第一个方法,我得到了相同的错误uncaughtreferenceerror:method未定义……要么您声明了它与您向我们展示的不同,要么您将undefined分配给openChat的某个地方。这就是您的全部代码吗?Bergi:作为一种解决方法,我注释掉了openChat函数,并将其逻辑放在JSON.get回调成功片段中。如果您看到我在OpenChat方法中以POST的形式提交表单,那么现在我将表单提交代码放在了我的setTimeOut部分。这样,我就可以等待1秒将表单提交到服务器,也就是说,在这1秒内,我可以从JSONStore.get回调获取数据。你是对的,为什么我使用===而不是!==,但是,即使我在JSONStore.get中使用openChat,我也会得到未捕获的引用错误:方法未定义您要求我在JSONStore.get回调中调用openChat的方法。我剪切粘贴的ifregUserName===未定义| | regUserMobile===未定义{openChatregUserName,regUserName;}在JSONStore.get Callback Jyoti内部:简单的方法毫无疑问是有效的,但我使用setTimeOut的条件不同。我也尝试了你的代码,只是在Function post中注释新行,一切正常。从var collectionName开始=“注册”;警报错误为+err;};呵呵。。。这是主要的技巧。。。你们并没有正确理解这个问题。。。您注释的代码是IBM worklight snippet,用于提取数据,这非常耗时,而且由于java脚本不等待提取,因此不会等待进一步的代码执行。所以我不得不使用setTimeOut声明,直到我的JSONStore无法提取为止。请等待JSONStore中的数据。。就因为这个有人否决了你的答案。。。您的解决方案是正确的,但它不适合此上下文。我认为异步性质不应该对语法产生影响。
function A() {
    B(1, 2)
}

function B(x,y) {
    if(true) {
        setTimeout(function() {
            C(3,4); 
        }, 1000);
    }    
}

function C(p,q) {
    alert('in c')
}

A()
function Submit_Data()
{   
    var ChatWindow_Height = 650;
    var ChatWindow_Width = 570;
    window.open("VodaFone Live Chat", "chat", "height=" + ChatWindow_Height + ", width = " + ChatWindow_Width);
    post("https://xyz/abc/StartChat.aspx", "post");
}

var regUserName,regUserMobile;
function post(path, method) {
    method = method || "post"; // Set method to post by default if not specified.

    // The rest of this code assumes you are not using a library.
    // It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);
    form.setAttribute("target", "chat");

    var hiddenField1 = document.createElement("input");
    var hiddenField2 = document.createElement("input");
    var hiddenField3 = document.createElement("input"); 

    var collectionName = 'Registration';
    var JSONStoreCollections = {};
    JSONStoreCollections[collectionName] = {};
    JSONStoreCollections[collectionName].searchFields = {uName: 'string'};
    WL.JSONStore.init(JSONStoreCollections) 

    .then(function () 
            {
        WL.JSONStore.get(collectionName).findAll().then(function (res) 
                {   
            WL.Logger.info('Registration retrived is :', res);
            console.log(JSON.stringify(res));

            console.log(res[0].json.userName+"  "+res[0].json.userMobile+" "+res[0].json.userPass+" "+res[0].json.userRePass);

            regUserName=res[0].json.userName;
            regUserMobile=res[0].json.userMobile;

            hiddenField1.setAttribute("type", "hidden");
            hiddenField1.setAttribute("id", "vName");
            hiddenField1.setAttribute("name", "vName");
            hiddenField1.setAttribute("value", regUserName);

            hiddenField2.setAttribute("type", "hidden");
            hiddenField2.setAttribute("id", "mobile");
            hiddenField2.setAttribute("name", "21512");
            hiddenField2.setAttribute("value", regUserMobile);

            hiddenField3.setAttribute("type", "hidden");
            hiddenField3.setAttribute("id", "state");
            hiddenField3.setAttribute("name", "21524");
            hiddenField3.setAttribute("value", "25");


            console.log("For Chat Data 1 is "+regUserName+"  "+regUserMobile);

                })
                .fail(function (err) 
                        {
                    WL.Logger.error("Failed authentication "+err);
                        });
            })
            .fail(function (err) 
                    {
                alert("Error is "+err);
                    });

    if(regUserName===undefined || regUserMobile===undefined)
    {
        setTimeout(function()   {
            form.appendChild(hiddenField1);
            form.appendChild(hiddenField2);
            form.appendChild(hiddenField3);

            document.body.appendChild(form);
            form.submit();

                }, 1000);
    }
}